初始化结构指针 - c

时间:2013-06-10 15:02:19

标签: c pointers initialization structure

很抱歉,这是一个太简单的问题。我试图编译一些套接字调用代码,我不得不使用这个

SOCKADDR_IN * sin;
sin.sin_addr.s_addr    = htonl(INADDR_ANY);   

问题是我被告知我必须初始化指针。 (有必要吗?)顺便问一下,如何初始化结构指针?

2 个答案:

答案 0 :(得分:4)

您需要为SOCKADDR_IN实例分配内存。您不必创建指针;你可以在堆栈上分配它

SOCKADDR_IN sin;
sin.sin_addr.s_addr    = htonl(INADDR_ANY);

如果要将&传递给期望sin

的函数,请使用地址运算符SOCKADDR_IN*
SOCKADDR_IN sin;
sin.sin_addr.s_addr    = htonl(INADDR_ANY);
....
function_using_socket_pointer(&sin);

更新:似乎你想使用动态分配的指针。您可以使用

执行此操作
SOCKADDR_IN* sin = malloc(sizeof(*sin));
if (sin == NULL) {
    /* insert oom handling here */
}
sin.sin_addr.s_addr    = htonl(INADDR_ANY);
....
free(sin);

答案 1 :(得分:3)

您希望在堆栈上声明一个而不是指针。指针只是一个内存地址,而不是对象的实际实例。

只需将代码更改为

即可
SOCKADDR_IN sin;
sin.sin_addr.s_addr    = htonl(INADDR_ANY);   

然后当您需要使用它时,请使用以下地址:&sin

修改原始问题解答

如果您真的希望这样做,请初始化指针:

SOCKADDR_IN* sin = (SOCKASSR_IN*)malloc(sizeof(SOCKADDR_IN));
....use sin....
free(sin);

这将在堆上分配内存,其大小设置为SOCKADDR_IN结构的大小。但如前所述,这是不必要的,除非您需要在当前堆栈帧(函数)之外使用此结构,否则通常应该避免这种情况。