如何计算结构体的大小?

3

unix(7)手册中,我找到了以下内容:

pathname: a UNIX domain socket can be bound to a null-terminated filesystem pathname using bind(2). When the address of a pathname socket is returned (by one of the system calls noted above), its length is

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不清楚。

7
+1 是为了计算 sun_path 中保存的字符串数据的终止 null 字符。 终止符占用的空间不会在 strlen 函数的结果中被计算进去。 - WhozCraig
1
结构体的大小为 sizeof(struct sockaddr_un)offsetof(struct sockaddr_un, sun_path) + strlen(sun_path) + 1 更接近数据的大小,假设存在一个 _null character_,则需要 +1。 - chux - Reinstate Monica
1个回答

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成员之间的偏移量(不包括.sun_path成员本身)。这是一个更差的计算方式,用于计算前面成员和填充所需的数据。

  2. strlen(sun_path).sun_path[]中不包含null字符字符串长度。如果sun_path不包含null字符,则结果为未定义行为(UB)。

  3. +1是为了假定sun_path中的null字符

这种计算对于将struct sockaddr_un中的数据发送到某个地方非常有用,因为数据需求可能显着小于结构需求。


我猜我们可以简单地使用strlen(sun_path) + sizeof(sun_family)

这是一个问题(取决于用法),因为

1)它不包括null字符

2)它没有考虑.sun_family.sun_path之间的潜在填充。尽管在这种情况下,我会惊讶地看到任何填充。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接