在程序中
#include<stdio.h>
struct t {
char a[5];
char b[];
} temp;
int main(){
temp.b[0] = 'c';
temp.b[1] = 'b';
temp.b[2] = '\0';
printf("Size of struct = %lu\n", sizeof(temp));
printf("String is %s\n", temp.b);
printf("Address of temp = %p\n", &temp);
printf("Address of array a = %p\n", &(temp.a));
printf("Address of b = %p\n", &(temp.b));
}
带输出
Size of struct = 5
String is cb
Address of temp = 0x601035
Address of array a = 0x601035
Address of b = 0x60103a
在这个程序中,阵列b究竟是如何分配的?多久了?这是一些未定义的行为,这只是在虚拟程序中成功,因为我没有做任何其他事情。运行到gdb,我可以访问一些初始化为零的内存位置,这让我怀疑它是在分配一些内存。
我确实有一个api,要求我将struct的一个元素格式化为int a [] [SIZE],我对此感到困惑。
另外,为什么sizeof没有考虑至少来自数组b的东西。我不确定它是否将它作为数组或指针。
答案 0 :(得分:3)
您使用它的方式是未定义的行为。要使用静态或自动存储(当您使用它时)回答您的直接问题,此成员的大小为0
。所以任何索引都是无效的。它似乎“似乎”在您的实验中工作,但请记住,c不会进行任何边界检查。事实上,你正在做无效的写作,你很幸运,你的例子不会崩溃和烧毁。
此类成员仅允许作为结构的最后成员,原因是您可以将其用于动态存储:
struct t *temp = malloc(sizeof(struct t) + 5 * sizeof(char));
将分配一个struct t
的实例,temp->b
是一个大小为5的char
数组。