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

C++实现元素存在性检测标记数组时数组元素不更新问题排查

C++标记数组修改失败问题排查

核心错误原因

    1. 动态数组未初始化
      你使用new int[n + 1]申请的数组不会自动初始化为0,数组元素值是内存中的随机垃圾值,这是你首次打印数组输出非0值的原因。
      修正方案:申请时添加空括号触发零初始化,修改为array = new int[n + 1]();
    1. 下标取值类型错误
      s[i][2]取到的是字符类型,比如输入+ 1时s[i][2]是字符'1',对应的ASCII码值为49,直接赋值给int类型的index会导致index实际为49,发生数组越界访问,自然无法修改你预期的下标1位置的元素。
      修正方案:将字符转为对应数字,修改为int index = s[i][2] - '0';

额外规范问题(非运行错误,但不符合C++标准)

    1. 变长数组不符合C标准
      main函数中string str[q];属于C语言的变长数组特性,不是C
      标准语法,仅部分编译器支持,建议替换为标准库容器:vector<string> str(q);
    1. 内存泄漏
      动态申请的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 08:12:01