未初始化结构体的数组为何会获取另一个数组的值?
未初始化的结构体柔性数组为何读取到其他数组的值?
尝试用结构体封装数组时遇到奇怪输出,未初始化的结构体成员
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
相关产品推荐
相关产品推荐

