You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

未初始化结构体的数组为何会获取另一个数组的值?

未初始化的结构体柔性数组为何读取到其他数组的值?

尝试用结构体封装数组时遇到奇怪输出,未初始化的结构体成员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;
}

输出:11 12 13

这是未定义行为导致的结果,核心原因出在你用的是C语言里的柔性数组成员,但使用方式完全错误:

  • 柔性数组data[]是结构体的最后一个成员,它本身不占用结构体的内存空间,只是一个“占位符”。直接声明Array myArray;时,仅分配了结构体里length成员的内存,data没有对应的存储空间。
  • 当访问myArray.data[0]时,程序会从myArray的内存地址往后偏移sizeof(int)的位置读取数据,而这个位置刚好在栈上存储了arr数组的内容——main函数的局部变量都在栈上分配,arr和myArray的内存位置相邻,所以“碰巧”读到了arr的值。
  • 这种行为完全没有保障,更换编译器、调整编译选项或者修改局部变量声明顺序,输出结果都会变化,甚至可能直接崩溃,因为你在访问不属于自己的内存区域。

正确使用柔性数组的方式是通过动态内存分配,示例代码如下:

// 分配能容纳5个int的柔性数组空间
Array* myArray = malloc(sizeof(Array) + 5 * sizeof(int));
myArray->length = 5;
// 之后可正常使用myArray->data
myArray->data[0] = 11;
myArray->data[1] = 12;
// 使用完成后记得释放内存
free(myArray);

内容的提问来源于stack exchange,提问作者Emre

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 01:43:20