#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;
}