C 函数指针赋值,为什么通过指针调用此函数会导致seg故障?

C 函数指针赋值,为什么通过指针调用此函数会导致seg故障?,c,sockets,pointers,segmentation-fault,C,Sockets,Pointers,Segmentation Fault,我已定义此结构: typedef struct Socket_s { ... SocketConnectFunc Connect; ... }Socket; 其中,SocketConnectFunc定义为: typedef Socket_Return (*SocketConnectFunc) (void * self); 初始化套接字结构时,我称之为: void Init(Socket * sock) { sock = (Socket *)malloc(s

我已定义此结构:

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\u Return是一个枚举(
typedef enum{SUCCESS,FAIL}Socket\u Return

我想这样写:

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

您需要传递指针的地址。只传递指针不能在调用者中更改它

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);

我认为这是因为Init原型需要是
voidinit(Socket**sock)
。否则,不会更改
sock
指针,因为它是通过值传入的。