有人能解释一下这段代码吗?
/* Pad to size of `struct sockaddr'. */
unsigned char sin_zero[sizeof (struct sockaddr) -
__SOCKADDR_COMMON_SIZE -
sizeof (in_port_t) -
sizeof (struct in_addr)];
这里sin_zero是一个char数组但剩下的部分是什么?它应该是一些整数。这个标志“ - ”是什么意思?任何人都可以向我解释一下吗?
答案 0 :(得分:3)
嗯,-
被称为“减号”:-)严重的是,方括号之间的所有内容都是为了计算sin_zero的大小,这就是所谓的填充。它是struct sockaddr_in
内的成员,它只是为了确保struct sockaddr_in
完全是一定的大小,最可能是16个字节。我们的想法是确保大多数(*)struct sockaddr
变体具有相同的大小以避免malloc问题。
引用a document I found on the subject:
POSIX规范在结构中只需要三个成员:sin_family,sin_addr和sin_port。符合POSIX的实现可以定义其他结构成员,这对于Internet套接字地址结构来说是正常的。几乎所有实现都添加了sin_zero成员,以便所有套接字地址结构的大小至少为16个字节。 的
(*)在早期版本中,我写了 all 。 @MaximYegorushkin正确地指出这不是真的,例如struct sockaddr_un
更大。如果您想要适合所有类型地址的最大大小,请使用sizeof(struct sockaddr_storage)
。此结构仅用于此目的(AFAIK)。
答案 1 :(得分:2)
sin_zero
是一个结构成员,用于将结构填充到某个最小尺寸。在这种情况下,填充量是通过从所需大小(sizeof (struct sockaddr)
)开始并从其中减去其他结构成员占用的空间来计算的。
所以,回答这个问题:这里的符号“ - ”只意味着“减法”。
答案 2 :(得分:1)
我也在学习C时遇到这个问题。 对于其他初学者(像我一样),知道它在你的程序中似乎是一种重要的清除* sin_zero *会很有趣(关于这个主题的更多内容可以找到HERE)。
在某些系统/架构上,它可能会导致问题,而在其他系统/架构上则可能没有明确清除* sin_zero *。
清除sin_zero的示例:
struct sockaddr_in serversin;
memset(&serversin, 0, sizeof(serversin));
serversin.sin_family = ...;
serversin.sin_addr = ...;
serversin.sin_port = ...;
为了防止将来出现一些错误,我认为明确清除它是最佳做法。
答案 3 :(得分:0)
Sockaddr包含一些内容,如in_addr和in_port_t,它还有更多空间。 sin_zero是sockaddr中的剩余大小。这是sockaddr的大小,没有其他东西填充。
据说sin_zero变量将初始化为所有空字节,并设置为最后一个字段或sockaddr结构的末尾。这样做的目的是将剩余的字节设置为空。
答案 4 :(得分:0)
sin_zeor是一个char数组,其大小使用[]括号中的公式计算 ' - '符号实际上是一个数学减号: - )
HTH
马里奥
答案 5 :(得分:0)
它根据某些结构的大小和常量计算数组的大小。符号“ - ”表示减号。