我今天接受系统编程课程的教授告诉我们,最后定义一个零长度数组的结构:
struct array{
size_t size;
int data[0];
};
typedef struct array array;
Run Code Online (Sandbox Code Playgroud)
这是一个有用的结构,用于定义或初始化带有变量的数组,即如下所示:
array *array_new(size_t size){
array* a = malloc(sizeof(array) + size * sizeof(int));
if(a){
a->size = size;
}
return a;
}
Run Code Online (Sandbox Code Playgroud)
也就是说,使用malloc(),我们还为大小为零的数组分配内存.这对我来说是全新的,而且看起来很奇怪,因为从我的理解来看,结构不必在连续的位置上有它们的元素.
为什么代码在array_new内存中分配data[0]?那么,为什么要访问它是合法的
array * a = array_new(3);
a->data[1] = 12;
Run Code Online (Sandbox Code Playgroud)
?
从他告诉我们的内容来看,似乎在结构的末尾定义为长度为零的数组确保在结构的最后一个元素之后立即出现,但这看起来很奇怪,因为再次,根据我的理解,结构可能有填充.
我也看到这只是gcc的一个特性,并没有任何标准定义.这是真的?