如何计算结构的大小?

时间:2018-12-07 06:15:27

标签: c linux struct

man unix(7)中,我发现了以下内容:

  

路径名:UNIX域套接字可以绑定到以空值结尾的   使用bind(2)的文件系统路径名。当一个路径名的地址   返回套接字(通过上述系统调用之一),   长度是

offsetof(struct sockaddr_un, sun_path) + strlen(sun_path) + 1

struct sockaddr_un被定义为

struct sockaddr_un {
    sa_family_t sun_family;               /* AF_UNIX */
    char        sun_path[108];            /* pathname */
};

所以我想我们可以简单地strlen(sun_path) + sizeof(sun_family)做我不明白他们添加的+1。能否请您解释一下?我了解offsetof用于描述可移植性

  

在Linux上,上面的offsetof()表达式等于   sizeof(sa_family_t),但其他一些实现包括其他   字段位于sun_path之前,因此offsetof()表达式可移植地描述了地址结构的大小。

但是这个+1对我来说还不清楚。

1 个答案:

答案 0 :(得分:3)

  

如何计算结构的大小?

结构的大小为sizeof(struct sockaddr_un)


  

我不明白他们添加的+1。你能解释一下吗?

此处代码试图确定结构中使用(或使用)的数据的长度。

offsetof(struct sockaddr_un, sun_path) + strlen(sun_path) + 1
  1. offsetof(struct sockaddr_un, sun_path)这是直到(但不包括).sun_path成员的偏移量。这是对先前成员和先前填充的 data 需求的强制转换计算。

  2. strlen(sun_path)string的长度,其中.sun_path[]中没有空字符。如果sun_path不包含空字符,则结果为未定义行为(UB)。

  3. +1用于sun_path中假定的空字符

这种计算对于将{em>数据发送到struct sockaddr_un的某个位置很有用,因为 数据的需求可能大大小于结构 >需求。


  

我想我们可以简单地strlen(sun_path) + sizeof(sun_family)

这是一个问题(取决于使用情况),因为

1)它不包含空字符

2)它不考虑成员.sun_family.sun_path之间的潜在填充。尽管在这种情况下,我会很惊讶地看到它。