C语言 为什么未初始化的结构体的数组从另一个数组获取值?

9wbgstp7  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(73)

当我尝试用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

w8biq8rn

w8biq8rn1#

在你的问题中有一个误解。你假设,你的结构成员data[x]是未初始化的。这不是全部的真相。事实上,这些甚至不存在于你的变量中。
你有一个结构体,它的最后一个成员是一个灵活的数组元素。如果你创建一个该结构体类型的变量,这不会占用任何内存。
这意味着,myArray.data[0]是一个非法的越界访问,访问了你的结构变量旁边的内存。这不是未初始化的内存,而是其他数组变量的内容。如果你写这个元素,你也会修改arr的内容。
变量中不能有灵活的数组成员。只有在为结构动态分配内存时才能有这样的数组成员:

Array *pArray = malloc(offsetof(Array, data) + N*sizeof(int) );`

字符串
这样就有足够的内存来存储结构体的固定部分和灵活部分。

相关问题