这是将struct sockaddr_in.sin_zero [8]初始化为0的正确方法吗?

时间:2014-10-08 11:27:17

标签: c++ c struct memset

我现在正在这样做,但

struct sockaddr_in my_addr;
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(MYPORT);
inet_aton("10.12.110.57", &(my_addr.sin_addr));
memset(&(my_addr.sin_zero), '\0', 8);
我能这样做吗?这还会使结构的其余部分归零吗?即。sin_zero[8]

struct sockaddr_in my_addr = {AF_INET, htons(MYPORT), 0};
// Or
struct sockaddr_in my_addr = {AF_INET, htons(MYPORT), {0} };

2 个答案:

答案 0 :(得分:4)

是的,这是正确的。当然你可以写0,它比'\0'更简洁。您也可以将8替换为sizeof my_addr.sin_zero,以确保设置正确的字节数。

更整洁的方式是:

struct sockaddr_in my_addr = { 0 };
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(MYPORT);

如果你想为整个事情使用括号封闭的初始化器,那么我建议使用指定的初始化器来提高可读性。这也许或不可能,因为在某些情况下,支撑的初始化器必须是常量表达式,并且不清楚MYPORT是否是变量。

答案 1 :(得分:1)

在C ++ 11中初始化结构的最简单方法是简单地添加一个大括号或者相等的初始化器,让aggregate initialization完成工作:

sockaddr_in my_addr {};

在C ++ 03中:

sockaddr_in my_addr = {};

顺便说一句,根据The Open Group Base Resolution bwg2001-004已删除sin_zero。根据您的平台,您可能不再需要关心该成员变量。