Назначение указателя функции, почему вызов этой функции через указатель приводит к ошибке seg?

#c #sockets #pointers #segmentation-fault

#c #сокеты #указатели #ошибка сегментации

Вопрос:

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

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

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

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

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

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

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

ПРИМЕЧАНИЕ. Socket_Return — это перечисление ( typedef enum {SUCCESS,FAIL} Socket_Return )

Комментарии:

1. Я думаю, это потому, что прототип инициализации должен быть void Init(Socket ** sock) . В противном случае sock указатель просто не изменяется, поскольку он передается по значению.

Ответ №1:

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

 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(amp;mysock);
  

Ответ №2:

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

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