当我尝试用struct封装数组时,我从代码中得到了奇怪的输出。在下面的片段中,struct成员data[]
数组从main函数中的另一个数组中获得相同的值而没有初始化。为什么会发生这种情况?
typedef struct {
int length;
int data[];
} Array;
int main() {
int arr[] = {11, 12, 13, 14, 15};
Array myArray;
printf("%d ", myArray.data[0]);
printf("%d ", myArray.data[1]);
printf("%d ", myArray.data[2]);
return 0;
}
字符串Output : 11 12 13
个
1条答案
按热度按时间w8biq8rn1#
在你的问题中有一个误解。你假设,你的结构成员
data[x]
是未初始化的。这不是全部的真相。事实上,这些甚至不存在于你的变量中。你有一个结构体,它的最后一个成员是一个灵活的数组元素。如果你创建一个该结构体类型的变量,这不会占用任何内存。
这意味着,
myArray.data[0]
是一个非法的越界访问,访问了你的结构变量旁边的内存。这不是未初始化的内存,而是其他数组变量的内容。如果你写这个元素,你也会修改arr
的内容。变量中不能有灵活的数组成员。只有在为结构动态分配内存时才能有这样的数组成员:
字符串
这样就有足够的内存来存储结构体的固定部分和灵活部分。