2011-06-05 103 views
0

我已经这个结构定义:函数指针赋值,为什么通过指针调用这个函数会导致seg错误?

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的方式有问题吗?

注意: Socket_Return是一个枚举(typedef enum {SUCCESS,FAIL} Socket_Return

+1

我认为它是因为初始化原型必须是'无效初始化(插座**袜子) '。否则'sock'指针就不会被修改,因为它是通过值传递的。 – BeeBand 2011-06-05 15:51:51

回答

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

我会写这样的:

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