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

C++动态数组封装为函数后输出内存地址问题求助

问题分析与修复方案

核心问题:值传递导致main中变量未更新

封装函数后出现的异常,本质是参数传递方式错误:

  • newGrade函数的gradePtr是值传递,函数内修改的只是指针副本,main里的原指针不会同步变化
  • size同样是值传递,函数内的size++不会影响main中的原变量
    此外代码还存在数组越界访问问题,会触发未定义行为(比如输出内存地址)。

修复步骤

  1. 改用引用传递参数,让函数能直接修改main中的原指针和size变量
  2. 修正数组大小与循环边界,避免越界访问

修复后的完整代码

#include <iostream>
using namespace std;

int numericMenu();
// 用引用传递指针和size,确保修改同步到main的原变量
void newGrade(int*& gradePtr, int& size);

int main() {
  int choice = 0;
  int* gradePtr = nullptr;
  int size = 0;

  do {
    choice = numericMenu();
    if (choice == 1)
    {
      newGrade(gradePtr, size);
    }

  } while(choice != 2);
  
  // 程序结束前释放动态内存,避免泄漏
  delete[] gradePtr;
  gradePtr = nullptr;
  return 0;
}

int numericMenu(){
  int choice = 0;
  cout << "1. Add Grade\n";
  cout << "2. Quit Program \n";
  cin >> choice;
  return choice;
}

void newGrade(int*& gradePtr, int& size){
  // 新数组大小设为size+1,容纳新增的分数
  int *pTemp = new int[size + 1];
   
  // 复制原数组的所有元素,循环边界为i < size(原数组共size个元素)
  for (int i = 0; i < size; i++)
    pTemp[i] = gradePtr[i];
  
  cout << "Enter score: ";
  cin >> pTemp[size]; // 新分数存在原数组最后一位的下一个位置

  // 释放原数组内存(delete[] nullptr是安全操作)
  delete[] gradePtr;
  gradePtr = pTemp;
  pTemp = nullptr;

  // 回显所有分数,新数组长度为size+1,循环边界为i < size+1
  cout << "当前所有分数:" << endl;
  for (int i = 0; i < size + 1; i++)
    cout << gradePtr[i] << endl;
  
  // 更新数组长度
  size++;
}

关键修改说明

  • 参数传递:将int* gradePtr改为int*& gradePtr(指针的引用),int size改为int& size(整数的引用),让函数内的修改直接作用到main中的原变量
  • 数组大小:临时数组pTemp的大小设为size+1,确保能容纳新增的分数
  • 循环边界:复制原数组时用i < size避免越界,回显时用i < size+1匹配新数组长度
  • 内存管理:main函数末尾添加delete[] gradePtr,释放动态分配的内存,避免内存泄漏

内容的提问来源于stack exchange,提问作者EpsilonSeven

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 22:42:48