Назначение указателя функции, почему вызов этой функции через указатель приводит к ошибке seg? - PullRequest
0 голосов
/ 05 июня 2011

У меня определена эта структура:

typedef struct Socket_s
{
  ...
  SocketConnectFunc         Connect;
  ...
}Socket;

где SocketConnectFunc определяется как:

typedef Socket_Return (*SocketConnectFunc) (void * self);

При инициализации структуры Socket я называю это:

void Init(Socket * sock)
{
    sock = (Socket *)malloc(sizof(Socket));
    if(sock)
      sock->Connect = SocketConnect;
}

Но затем, когда я пытаюсь вызвать sock->Connect(), я получаю ошибку сегментации, и функция даже не вводится. Есть ли проблема в способе, которым я назначил sock->Connect?

NB. Socket_Return - это перечисление (typedef enum {SUCCESS,FAIL} Socket_Return)

Ответы [ 2 ]

4 голосов
/ 05 июня 2011

Вам необходимо передать адрес указателя. Передав только указатель, вы не можете изменить его в вызывающем абоненте

void Init(Socket ** sock) {
    *sock = malloc(sizeof **sock); /* don't cast the return value of malloc! */
    if (*sock)
        (*sock)->connect = SocketConnect;
}

И назови это так

struct Socket_s *mysock;
Init(&mysock);
4 голосов
/ 05 июня 2011

Я бы написал так:

Socket * CreateSocket() {
    Socket * sock = (Socket *) malloc( sizeof( Socket ) );
    if ( sock ) {
      sock->Connect = SocketConnect;
    }
    return sock;
}
...