C++自定义类指针数组越界访问问题咨询
问题解答
首先明确:C++的原生数组没有自动扩容机制,你遇到的现象是数组越界访问导致的未定义行为,而非数组被扩容。
为什么越界访问cp[2]能正常输出?
你定义的custom* cp[2]是栈上分配的固定大小数组,仅包含2个指针位置(合法索引为0和1)。当你访问cp[2]时,本质是在栈上读写数组末尾之后的相邻内存区域。
此时这块内存刚好没有被栈上的其他关键数据(比如函数返回地址、栈帧保护变量)占用,也没有被其他代码修改,所以你暂时能成功写入vector元素的地址并读取对应的值——这完全是偶然的内存布局巧合,不是语言特性或数组的“隐藏扩容”。
为什么i <=3时会触发栈溢出检测?
当循环到i=3时,你访问的cp[3]已经越过数组更远的位置,覆盖了栈上的栈帧保护数据(编译器默认会在栈帧中插入这类数据,用于检测栈溢出)。当函数main准备返回时,编译器生成的检测代码发现保护数据被修改,就会触发stack smashing detected错误并终止程序。
关键结论
C++标准不要求原生数组做越界访问的运行时检查,越界访问属于未定义行为——它可能正常运行、可能崩溃、可能悄悄破坏其他数据导致后续诡异问题,完全取决于当时的内存布局。这和vector::at()不同,at()会主动做越界检查并抛出std::out_of_range异常,而原生数组的[]操作符没有任何安全检查。
内容的提问来源于stack exchange,提问作者Amandeephy
相关产品推荐
相关产品推荐

