C++动态数组封装为函数后输出内存地址问题求助
问题分析与修复方案
核心问题:值传递导致main中变量未更新
封装函数后出现的异常,本质是参数传递方式错误:
newGrade函数的gradePtr是值传递,函数内修改的只是指针副本,main里的原指针不会同步变化size同样是值传递,函数内的size++不会影响main中的原变量
此外代码还存在数组越界访问问题,会触发未定义行为(比如输出内存地址)。
修复步骤
- 改用引用传递参数,让函数能直接修改main中的原指针和size变量
- 修正数组大小与循环边界,避免越界访问
修复后的完整代码
#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
相关产品推荐
相关产品推荐

