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

Posted

技术标签:

【中文标题】这是将 struct sockaddr_in.sin_zero[8] 初始化为 0 的正确方法吗?【英文标题】:Is this a correct way of initializing struct sockaddr_in.sin_zero[8] as 0? 【发布时间】:2014-10-08 11:27:17 【问题描述】:

我现在正在这样做,但是

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 ;

【问题讨论】:

两者都可以。正如 Matt McNabb 在他的回答中提到的那样,在第二种情况下指定的初始化程序将使代码更具可读性。 【参考方案1】:

是的,没错。当然,您可以只写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 是否是变量。

【讨论】:

@MattMcNabb 我删除了该评论我修复了问题中的代码。所以我的三个方法都正确? @pizzaEatingGuy 是的,尽管您应该选择更健壮且容易被视为正确的方法(即,检查您的代码的人不需要查找文档来查看您是否获得了正确的数字memset 中的字节数,或大括号初始值设定项的正确顺序)【参考方案2】:

在 C++11 中对结构进行值初始化的最简单方法是简单地添加一个大括号或等号初始化器,然后让 aggregate initialization 完成这项工作:

sockaddr_in my_addr ;

在 C++03 中:

sockaddr_in my_addr = ;

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

【讨论】:

以上是关于这是将 struct sockaddr_in.sin_zero[8] 初始化为 0 的正确方法吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用“struct.pack”将数据写入文件时出错

我可以将相关对象添加到Swift Struct吗?

将大端字节数组转换为 int,如 python 中的 struct.unpack

如何使用 struct 覆盖二维数组中的所有整数?

将 SHBrowseForFolder 和 struct BROWSEINFO 的使用更改为 - IFileOpenDialog

使用 struct id 将收藏夹保存到 UserDefaults