很抱歉,这是一个太简单的问题。我试图编译一些套接字调用代码,我不得不使用这个
SOCKADDR_IN * sin;
sin.sin_addr.s_addr = htonl(INADDR_ANY);
问题是我被告知我必须初始化指针。 (有必要吗?)顺便问一下,如何初始化结构指针?
答案 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结构的大小。但如前所述,这是不必要的,除非您需要在当前堆栈帧(函数)之外使用此结构,否则通常应该避免这种情况。