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

Is this a correct way of initializing struct sockaddr_in.sin_zero[8] as 0?

本文关键字:初始化 方法 结构 sockaddr in zero sin      更新时间:2023-10-16

我现在正在做这件事,但

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), '', 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} };

是的,它是正确的。当然,您可以只编写0,它没有''那么冗长。您也可以用sizeof my_addr.sin_zero替换8,以确保您设置的字节数正确。

更整洁的方法是:

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

如果你想在整个过程中使用一个大括号括起来的初始化器,那么为了可读性,我建议使用指定的初始化器。此外,这可能是可能的,也可能不是可能的,因为在某些情况下,支撑初始化程序必须是常量表达式,并且不清楚MYPORT是否是变量。

在C++11中对结构进行值初始化的最简单方法是简单地添加一个大括号或相等的初始化器,并让聚合初始化完成工作:

sockaddr_in my_addr {};

在C++03:中

sockaddr_in my_addr = {};

顺便说一句,sin_zero已根据开放组基础决议bwg2001-004删除。根据您的平台,您可能不再需要关心该成员变量。