【发布时间】:2016-03-16 13:12:35
【问题描述】:
我有一个零单元格数组,我想显示他的大小。 我的代码是:
#include <stdio.h>
#include <string.h>
#include <stdint.h>
typedef struct ts_ff {
uint8_t reserved[0];
} TS_fact;
int main(void) {
TS_fact ts_factory;
printf("size of reserved is %zu Bytes\n",sizeof(ts_factory));
return 0;
}
但是此代码的返回返回 0 字节而不是该数组单元格的 1 字节。
size of reserved is 0 Bytes
为什么编译器会这样做?
【问题讨论】:
-
一个单元格?我看到零单元格。
-
一个单元格的数组 => 在哪里?
-
好的。所以,为什么我可以使用 ts_factory.reserved[0]=12;例如。我可以使用这个细胞。编译器影响值没有错误。
-
在
uint8_t reserved[0]中,0不是最后一个元素的索引,而是数组的大小。如果您分配reserved[0] = 12,您指的是索引为0的元素。在声明中,给出的数字是数组的大小,而不是索引。例如,声明uint8_t a[10]将有 10 个元素,但a[10]将是无效索引,因为该数组的索引从 0 到 9(10 个元素)。 -
零大小数组是一个过时和弃用的 gcc 扩展。 C 标准在 ISO9899:1999 (C99) 中引入了灵活的数组成员。使用它们!