C++中未定义n时声明的int A[n]的sizeof值固定的原因是什么
问题解释
- 首先你代码中的
int A[n]不属于标准C语法,这是GCC、Clang等编译器提供的**变长数组(VLA, Variable Length Array)**扩展特性,使用标准C编译参数(例如g++ -std=c++17 -pedantic-errors)编译会直接报错。你之前认为的「数组属于静态数据类型,占用内存大小不受n影响」是标准C++对定长数组的要求(定长数组长度必须是编译期常量),该规则不适用于变长数组扩展。 - 496这个数值的来源很明确:变长数组的大小会在声明瞬间由当时的
n值决定,sizeof对变长数组的求值是运行时行为。你声明数组A时,n是未初始化的栈上局部变量,存储的是栈内存中残留的随机垃圾值,本次运行时该垃圾值恰好为124,int类型占4字节,因此数组总大小为124 * 4 = 496字节。 - 后续你通过
cin给n赋值后sizeof(A)结果不变,是因为变长数组的长度仅在声明时确定一次,声明完成后数组大小就固定了,后续修改n的值不会对已经创建完成的数组A产生任何影响。
提醒:使用未初始化的变量声明变长数组属于未定义行为,下次运行程序时栈内存残留值可能变化,
sizeof(A)的输出也会随之改变,甚至可能因为n的垃圾值过大导致栈溢出直接崩溃。生产环境不建议使用变长数组扩展,如需动态长度的序列优先使用标准库的std::vector。
内容的提问来源于stack exchange,提问作者Itzz_CJ
相关产品推荐
相关产品推荐

