相关疑难解决方法(0)

C数组可以在元素之间包含填充吗?

我听说有传言说,在C中,包含在结构中的数组可能在数组的元素之间添加了填充.显然,填充量不能在任何元素对之间变化,或者使用简单的指针算法计算数组中的下一个元素是不可能的.

这个谣言还指出,结构中没有包含的阵列保证不包含填充物.我知道至少那部分是真的.

因此,在代码中,谣言是:

{
    // Given this:
    struct { int values[20]; } foo;
    int values[20];

    // This may be true:
    sizeof(values) != sizeof(foo.values);
}
Run Code Online (Sandbox Code Playgroud)

我非常肯定sizeof(values)会永远相等sizeof(foo.values).但是,我无法在C标准(特别是C99)中找到明确证实或否认这一点的任何内容.

有谁知道这个谣言是否在任何C标准中得到解决?

编辑:我知道在数组foo.values的结尾和结构的结尾之间可能存在填充foo,并且标准声明在开始foo和开始之间不存在填充foo.values.但是,是否有人引用引用标准,其中表示元素之间没有填充foo.values

c arrays padding

25
推荐指数
2
解决办法
8857
查看次数

期望成员之间没有填充是否安全?

正如C11草案所述,我可以向这两个人保证:

  1. ...结构对象中可能有未命名的填充,但不是在它的开头.

  2. 结构或联合的末尾可能有未命名的填充.

但是,如果任何两个成员之间的填充是可以接受的,那对我来说是不明确的.这是因为,通过说第二段,标准似乎暗示填充只能在结构或联合的末尾.例如,假设int占用4个字节,

#include <stdio.h>

struct s {
    char c;
    int a;
};

int main(void) {
    printf("%d\n", sizeof(struct s));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我可以得出结论,在c和之间没有填充a吗?

c struct padding language-lawyer

2
推荐指数
1
解决办法
87
查看次数

标签 统计

c ×2

padding ×2

arrays ×1

language-lawyer ×1

struct ×1