当我try 使用 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

推荐答案

你的问题中有一个误解. 假设您的 struct 成员data[x]未初始化. 这并不是事实的全部. 事实上,这些变量甚至不存在于您的变量中.

你有一个 struct 体,它的最后一个成员是一个灵活的数组元素. 如果创建该 struct 类型的变量,则不会占用任何内存.

这意味着,myArray.data[0]是对 struct 变量旁边内存的非法越界访问. 这不是未初始化的内存,而只是其他数组变量的内容.如果您写入该元素,还将修改arr的内容.

变量中不能有灵活的数组成员. 只有在为 struct 动态分配内存时,才能有这样的数组成员:

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

那么您就有足够的内存用于 struct 的固定部分以及灵活部分.

C++相关问答推荐

为什么listen()(在调用accept()之前)足以让应用程序完成3次握手?

与unions 的未定义行为

什么C代码将确定打开的套接字正在使用的网络适配器?

如何创建由符号组成的垂直结果图形?

#If指令中未定义宏?

初始变量重置后,char[]的赋值将消失

预先分配虚拟地址空间的区域

解决S随机内存分配问题,实现跨进程高效数据共享

RawMotion的XInput2错误(具有较高值的XISelectEvents上的BadValue)

S在本文中的价值观到底出了什么问题?

GCC奇怪的行为,有fork 和印花,有换行符和不换行符

正数之和是负数

Wcstok导致分段故障

C语言中奇怪的输出打印数组

CS50 pset 5的皱眉脸正确地处理了大多数基本单词,并且拼写判断不区分大小写.

从整型转换为浮点型可能会改变其值.

在printf()中用%.*S格式填充长度为0的字符串是否会调用任何UB?如果是,是哪一个?

Leet代码运行时错误:代码不会在Leet代码上编译,而是在其他编译器中编译,如netbeans和在线编译器

'printf("%s", user_input)' 危险吗?

我该如何处理这个 C 90 代码中的内存泄漏?