【问题标题】:How to count the size of the structure?如何计算结构的大小?
【发布时间】:2019-05-08 21:47:32
【问题描述】:

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

路径名:一个 UNIX 域套接字可以绑定到一个空终止的 使用 bind(2) 的文件系统路径名。当路径名的地址 socket 被返回(通过上面提到的系统调用之一),它的 长度是

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 表示sun_path 中保存的字符串数据的终止空字符。 strlen 本身的结果考虑终止符占用的空间。
  • 结构体大小为sizeof(struct sockaddr_un)offsetof(struct sockaddr_un, sun_path) + strlen(sun_path) + 1 更接近数据的大小,并且假设存在 null 字符,则需要 +1。

标签: c linux struct


【解决方案1】:

如何计算结构的大小?

结构的大小是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 中假定的空字符

这样的计算对于在struct sockaddr_un 某处发送数据 很有用,因为数据 的需求可能远小于结构 的需求.


我猜我们可以简单地做到strlen(sun_path) + sizeof(sun_family)

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

1) 不包含空字符

2) 它不考虑成员 .sun_family.sun_path 之间的潜在填充。虽然在这种情况下我会很惊讶地看到任何东西。

【讨论】:

    猜你喜欢
    • 2011-02-09
    • 2015-06-03
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 2017-04-26
    • 1970-01-01
    相关资源
    最近更新 更多