C++菜单驱动数组程序:显示、求和求积时首元素异常求助
问题根源与修复方案
代码中的核心错误
- 零长度数组+循环内定义:
int lst[] = {};是C++标准不允许的零长度数组,而且每次进入while循环都会重新创建这个数组,之前输入的数据直接丢失。往这个数组写入n个元素会触发内存越界,破坏栈上的其他数据(这就是你看到第一个元素被莫名修改的原因)。 - 未初始化变量:
int n;在循环内部定义,当用户选择2/3/4时,n是未赋值的垃圾值,循环次数完全不可控,进一步加剧内存越界问题。 - 数组传参误区:你尝试用
sizeof(arr)获取数组长度是无效的——数组作为函数参数时会退化为指针,sizeof(arr)得到的是指针的大小,不是数组实际长度。
修复方案(推荐用vector,更安全)
用C++标准库的vector<int>替代手动数组,它会自动管理内存,避免越界和内存泄漏问题:
#include <iostream> #include <vector> using namespace std; void input(vector<int>& a, int n) { a.resize(n); for (int i = 0; i < n; i++) { int val; cout << "Enter value: "; cin >> val; a[i] = val; } } void display(const vector<int>& a) { cout << "Values present are: "; for (int num : a) { cout << num << " "; } cout << endl; } void sum(const vector<int>& a) { int total = 0; for (int num : a) { total += num; } cout << "SUM = " << total << endl; } void product(const vector<int>& a) { long long total = 1; // 用long long避免整数溢出 for (int num : a) { total *= num; } cout << "PRODUCT = " << total << endl; } int main() { vector<int> lst; bool is_created = false; while (true) { int ch; cout << "\n1.Create list \n2.Display values \n3.Find Sum \n4.Find product \n5.EXIT" << endl; cout << "Enter choice: "; cin >> ch; if (ch == 1) { int n; cout << "Enter number of values to be added: "; cin >> n; input(lst, n); is_created = true; } else if (ch == 2) { if (!is_created) { cout << "请先创建数组!" << endl; continue; } display(lst); } else if (ch == 3) { if (!is_created) { cout << "请先创建数组!" << endl; continue; } sum(lst); } else if (ch == 4) { if (!is_created) { cout << "请先创建数组!" << endl; continue; } product(lst); } else if (ch == 5) { break; } else { cout << "无效选择" << endl; } } return 0; }
修复点说明
- 把
lst和is_created标记放到循环外,保证数据不会每次循环重置 - 用
vector自动管理内存,resize(n)直接分配所需空间,避免越界 - 函数直接传
vector引用,无需单独传长度,通过vector的迭代器或size()即可获取元素数量 - 增加未创建数组时的提示,防止非法访问
- 乘积函数改用
long long,避免多个整数相乘导致的溢出问题
若坚持用C风格动态数组
如果想手动管理内存,可使用动态分配的数组,但要注意释放内存避免泄漏:
#include <iostream> using namespace std; void input(int* a, int n) { for (int i = 0; i < n; i++) { int val; cout << "Enter value: "; cin >> val; a[i] = val; } } void display(const int* a, int n) { cout << "Values present are: "; for (int i = 0; i < n; i++) { cout << a[i] << " "; } cout << endl; } void sum(const int* a, int n) { int total = 0; for (int i = 0; i < n; i++) { total += a[i]; } cout << "SUM = " << total << endl; } void product(const int* a, int n) { long long total = 1; for (int i = 0; i < n; i++) { total *= a[i]; } cout << "PRODUCT = " << total << endl; } int main() { int* lst = nullptr; int n = 0; while (true) { int ch; cout << "\n1.Create list \n2.Display values \n3.Find Sum \n4.Find product \n5.EXIT" << endl; cout << "Enter choice: "; cin >> ch; if (ch == 1) { // 释放旧数组,避免内存泄漏 if (lst != nullptr) { delete[] lst; lst = nullptr; } cout << "Enter number of values to be added: "; cin >> n; lst = new int[n]; input(lst, n); } else if (ch == 2) { if (lst == nullptr) { cout << "请先创建数组!" << endl; continue; } display(lst, n); } else if (ch == 3) { if (lst == nullptr) { cout << "请先创建数组!" << endl; continue; } sum(lst, n); } else if (ch == 4) { if (lst == nullptr) { cout << "请先创建数组!" << endl; continue; } product(lst, n); } else if (ch == 5) { // 程序退出前释放内存 if (lst != nullptr) { delete[] lst; } break; } else { cout << "无效选择" << endl; } } return 0; }
注意事项
- 动态分配的数组必须用
delete[]释放,否则会造成内存泄漏 - 每次创建新数组前要释放旧的,避免内存堆积
内容的提问来源于stack exchange,提问作者Res3t
相关产品推荐
相关产品推荐

