struct中包含未初始化大小的数组

时间:2017-05-18 22:39:08

标签: c arrays struct

在程序中

#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的东西。我不确定它是否将它作为数组或指针。

1 个答案:

答案 0 :(得分:3)

您使用它的方式是未定义的行为。要使用静态或自动存储(当您使用它时)回答您的直接问题,此成员的大小为0。所以任何索引都是无效的。它似乎“似乎”在您的实验中工作,但请记住,不会进行任何边界检查。事实上,你正在做无效的写作,你很幸运,你的例子不会崩溃和烧毁。

此类成员仅允许作为结构的最后成员,原因是您可以将其用于动态存储:

struct t *temp = malloc(sizeof(struct t) + 5 * sizeof(char));

将分配一个struct t的实例,temp->b是一个大小为5的char数组。