函数指针赋值,为什么通过指针调用这个函数导致seg错误?

时间:2011-06-05 15:41:09

标签: c sockets pointers segmentation-fault

我定义了这个结构:

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 个答案:

答案 0 :(得分:4)

我会这样写:

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

答案 1 :(得分:4)

您需要传递指针的地址。仅传递指针,您无法在调用者中更改它

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