C++ 函数返回数组后打印除首元素外其余值异常问题咨询
问题触发原因
核心问题是你返回了栈上局部变量的指针:
- 函数内定义的
int result[11]是栈内存局部变量,函数执行结束后,这块内存会被系统自动回收,允许被后续操作覆盖。 - 你拿到的返回指针指向的是已经失效的内存,访问属于未定义行为:第一次打印时内存还没被覆盖,能读到正确值,第二次打印前这块内存已经被
cout操作的栈数据覆盖,就会出现随机乱码值。 - 另外你写死数组长度为11也存在风险,入参变化时会导致数组越界写入。
修复方案
推荐优先用C++标准容器避免手动内存管理,可选方案如下:
方案1:返回std::vector(最推荐)
#include <iostream> #include <vector> using namespace std; vector<int> getIntervalArray(int begin, int end, int interval) { int len = (end - begin) / interval + 1; vector<int> result(len); for (int i = 0; i < len; i++) { result[i] = begin + interval * i; } return result; } int main() { int begin = 0, end = 10, interval = 1; vector<int> newResult = getIntervalArray(begin, end, interval); cout << newResult[0] << endl; cout << newResult[1] << endl; return 0; }
方案2:堆上动态分配内存返回(需手动释放)
如果必须返回原始指针,用new在堆上分配内存,堆内存不会随函数结束自动回收:
#include <iostream> using namespace std; int* getIntervalArray(int begin, int end, int interval, int& outLen) { outLen = (end - begin) / interval + 1; int* result = new int[outLen]; for (int i = 0; i < outLen; i++) { result[i] = begin + interval * i; } return result; } int main() { int begin = 0, end = 10, interval = 1, len; int* newResult = getIntervalArray(begin, end, interval, len); cout << newResult[0] << endl; cout << newResult[1] << endl; delete[] newResult; // 用完必须手动释放,避免内存泄漏 return 0; }
方案3:调用方提前分配内存传入
由调用方负责内存生命周期,函数仅做填充逻辑:
#include <iostream> using namespace std; void fillIntervalArray(int begin, int end, int interval, int* result) { int len = (end - begin) / interval + 1; for (int i = 0; i < len; i++) { result[i] = begin + interval * i; } } int main() { int begin = 0, end = 10, interval = 1; int result[11] = {}; fillIntervalArray(begin, end, interval, result); cout << result[0] << endl; cout << result[1] << endl; return 0; }
内容的提问来源于stack exchange,提问作者user6210457
相关产品推荐
相关产品推荐

