You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

传递指针至函数分配初始化后数组值异常问题

问题分析与解决

核心问题出在内存分配的语句上:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 20:20:58