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

C++菜单驱动数组程序:显示、求和求积时首元素异常求助

问题根源与修复方案

代码中的核心错误

  1. 零长度数组+循环内定义:int lst[] = {};是C++标准不允许的零长度数组,而且每次进入while循环都会重新创建这个数组,之前输入的数据直接丢失。往这个数组写入n个元素会触发内存越界,破坏栈上的其他数据(这就是你看到第一个元素被莫名修改的原因)。
  2. 未初始化变量:int n;在循环内部定义,当用户选择2/3/4时,n是未赋值的垃圾值,循环次数完全不可控,进一步加剧内存越界问题。
  3. 数组传参误区:你尝试用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 04:09:55