C++实现元素存在性检测标记数组时数组元素不更新问题排查
C++标记数组修改失败问题排查
核心错误原因
- 动态数组未初始化
你使用new int[n + 1]申请的数组不会自动初始化为0,数组元素值是内存中的随机垃圾值,这是你首次打印数组输出非0值的原因。
修正方案:申请时添加空括号触发零初始化,修改为array = new int[n + 1]();
- 动态数组未初始化
- 下标取值类型错误
s[i][2]取到的是字符类型,比如输入+ 1时s[i][2]是字符'1',对应的ASCII码值为49,直接赋值给int类型的index会导致index实际为49,发生数组越界访问,自然无法修改你预期的下标1位置的元素。
修正方案:将字符转为对应数字,修改为int index = s[i][2] - '0';
- 下标取值类型错误
额外规范问题(非运行错误,但不符合C++标准)
- 变长数组不符合C标准
main函数中string str[q];属于C语言的变长数组特性,不是C标准语法,仅部分编译器支持,建议替换为标准库容器:vector<string> str(q);
- 变长数组不符合C标准
- 内存泄漏
动态申请的array数组使用后未释放,函数结束前需要添加delete[] array;释放内存。
- 内存泄漏
修正后的完整代码
#include <iostream> #include <vector> #include <string> using namespace std; void func(int n, int m, int q, string s[]) { int *array = new int[n + 1](); // 零初始化 // 打印初始数组 for (int i = 0; i <= n; i++) { cout << array[i] << " "; } cout << endl; for (int i = 0; i < q; i++) { if (s[i][0] == '+') { int index = s[i][2] - '0'; // 字符转数字 array[index] = 1; // 打印修改后数组 for (int j = 0; j <= n; j++) { cout << array[j] << " "; } cout << endl; } } delete[] array; // 释放内存 } int main() { int n, m, q; cin >> n >> m >> q; cin.ignore(); vector<string> str(q); // 标准容器替代变长数组 for (int i = 0; i < q; i++) { getline(cin, str[i]); } func(n, m, q, str.data()); return 0; }
内容的提问来源于stack exchange,提问作者k john
相关产品推荐
相关产品推荐

