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

代码抛出0xC0000005访问违例异常排查及二维数组实现需求

解决Access Violation异常并实现目标二维数组与字符串数组

首先,你遇到的0xC0000005访问违例是内存操作的几个关键错误导致的,咱们一个个捋清楚,同时帮你完成创建二维数组和字符串数组的目标:

核心错误分析

  • 二维数组初始化完全错误:你写的int** myNodes = new int*;只分配了单个指针的空间,不是一个可以容纳多个指针的数组。后面循环myNodes[i]的时候,只要i>0就会访问不属于你的内存,直接触发访问违例。
  • genNode函数参数与实现不匹配:函数定义的int **x[]是指向指针数组的指针,但你调用时传的是&myNodes(类型是int***),类型不匹配;而且你给int类型的数组元素赋值NULL(指针类型),这是类型错误,应该用数值0或者合理的初始值。
  • 内存清理范围错误:你最后循环清理index个元素,但实际上只给index-6个元素分配了内存,清理未分配的内存会导致未定义行为。
  • 字符串数组未正确实现:你注释掉了nameNodes的代码,需要正确分配字符串数组来存储每行的子串。

修正后的完整代码

#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib> // 包含rand()的头文件
using namespace std;

// 修正genNode函数的参数和实现
void genNode(int** x, int n){
    /* 格式化 [0] D [1] I [2] E [3] x [4] y */
    x[n][0] = 0; // 用0代替NULL,因为是int类型
    x[n][1] = 0;
    x[n][2] = 0;
    x[n][3] = rand() % 1000 + 1; // 生成1到1000的随机数
    x[n][4] = rand() % 1000 + 1;
}

int main() {
    int index = 0; // 从0开始计数更合理
    string line;
    ifstream myfile("spp_N151_E192_R8_232.nodes.txt");

    if (myfile.is_open()) {
        // 先读取所有行,统计总行数
        while (getline(myfile, line)) { // 用getline作为循环条件,避免多读一行
            index++;
        }
        myfile.close();

        // 重新打开文件读取内容(刚才读完后文件指针到末尾了)
        ifstream myfile2("spp_N151_E192_R8_232.nodes.txt");
        if (!myfile2.is_open()) {
            cout << "Unable to re-open file";
            return 1;
        }

        // 创建目标二维数组:行数为index-6
        int targetRowCount = index - 6;
        int** myNodes = new int*[targetRowCount];
        // 创建字符串数组:大小为index,存储每行的子串
        string* nameNodes = new string[index];

        int currentLine = 0;
        while (getline(myfile2, line)) {
            // 存储子串r到字符串数组
            nameNodes[currentLine] = line.substr(0, 200);
            // 只给前targetRowCount行分配二维数组的内存并初始化
            if (currentLine < targetRowCount) {
                myNodes[currentLine] = new int[5];
                genNode(myNodes, currentLine);
                cout << "myNodes [" << currentLine << "] address: " << myNodes[currentLine] << endl;
            }
            currentLine++;
        }
        myfile2.close();

        cout << "Number of nodes: " << index << endl;
        cout << "Target 2D array rows: " << targetRowCount << endl;

        // 内存清理
        // 清理二维数组
        for (int i = 0; i < targetRowCount; ++i) {
            delete[] myNodes[i];
        }
        delete[] myNodes;
        // 清理字符串数组
        delete[] nameNodes;
    } else {
        cout << "Unable to open file";
        return 1;
    }

    return 0;
}

关键修正点说明

  1. 正确统计行数:用while (getline(myfile, line))代替while (myfile.good()),避免因为文件末尾的标记导致多读一行。
  2. 重新打开文件:第一次读取后文件指针到了末尾,所以需要重新打开来读取内容并存储子串和初始化数组。
  3. 二维数组正确初始化:先根据总行数index计算目标行数index-6,然后创建对应大小的指针数组int** myNodes = new int*[targetRowCount];,再逐个分配每行的int数组。
  4. genNode函数修正:参数改为int** x(直接接收二维数组指针),用0初始化int元素,避免类型错误。
  5. 字符串数组实现:创建string* nameNodes = new string[index];,在读取每行时直接赋值子串。
  6. 内存清理匹配:只清理实际分配的targetRowCount个二维数组元素,以及字符串数组。

内容的提问来源于stack exchange,提问作者Horror Symphony

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 15:34:05