C中的数组元素计数

Dim*_*nek 6 c arrays alignment

我总是使用以下范例来迭代C中的静态定义数组:

struct foo { ... };
struct foo array[10];

for (int i; i < sizeof(array) / sizeof(array[0]); i++)
    ...
Run Code Online (Sandbox Code Playgroud)

而且,到目前为止,每次都有效;-)

但令人惊讶的是,如果结构实际上长度不能自然对齐,那么这不会破坏,例如:

struct foo { long a; char b; };
Run Code Online (Sandbox Code Playgroud)

如果不是编译器决定,sizeof(struct foo) == 7sizeof(array) == 32由于对齐(LP64数据模型)?

Eug*_*Sh. 5

作为C99标准,第6.5.3.4节说明了sizeof运营商:

当应用于具有数组类型的操作数时,结果是数组中的总字节数.

和:

示例2 sizeof运算符的另一个用途是计算数组中元素的数量:

     `sizeof array / sizeof array[0]`
Run Code Online (Sandbox Code Playgroud)

所以数组的大小总是它的元素大小的倍数.

关于结构的同一段:

当应用于具有结构或联合类型的操作数时,结果是此类对象中的总字节数,包括内部和尾部填充.