【问题标题】:Is this a correct way of initializing struct sockaddr_in.sin_zero[8] as 0?这是将 struct sockaddr_in.sin_zero[8] 初始化为 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 在他的回答中提到的那样,在第二种情况下指定的初始化程序将使代码更具可读性。

标签: c++ c struct memset


【解决方案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 删除。根据您的平台,您可能不再需要关心该成员变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    相关资源
    最近更新 更多