传递指针至函数分配初始化后数组值异常问题
问题分析与解决
核心问题出在内存分配的语句上:
p = new int(20);
这行代码的作用是分配单个int类型的内存空间,并将其初始化为20,而非你想要的分配包含20个int元素的数组。后续循环中i从0到19,除i=0是访问合法内存外,i≥1的所有操作都是越界访问未分配的内存区域,这属于C++中的未定义行为。
未定义行为的表现不可预测:foo函数内输出时,这块越界内存可能还没被其他操作覆盖,所以数值看起来正常;但回到main函数后,该区域内存已被程序其他逻辑修改,就出现了垃圾值。
修正代码
将内存分配语句改为数组形式,同时记得释放内存避免泄漏:
#include <iostream> void foo(int*& p) { p = new int[20]; // 改为数组分配方式 for (int i = 0; i < 20; ++i){ *(p+i) = i; std::cout << *(p+i) << std::endl; } } int main() { int* p = nullptr; foo(p); for (int i = 0; i < 20; ++i) std::cout << *(p+i) << std::endl; delete[] p; // 释放数组内存 }
更安全的替代方案
手动管理裸指针易引发内存泄漏和越界问题,推荐使用标准库容器std::vector,它会自动处理内存分配与释放:
#include <iostream> #include <vector> void foo(std::vector<int>& vec) { vec.resize(20); for (int i = 0; i < 20; ++i){ vec[i] = i; std::cout << vec[i] << std::endl; } } int main() { std::vector<int> vec; foo(vec); for (int num : vec) std::cout << num << std::endl; }
内容的提问来源于stack exchange,提问作者mehdi_bm
相关产品推荐
相关产品推荐

