代码抛出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; }
关键修正点说明
- 正确统计行数:用
while (getline(myfile, line))代替while (myfile.good()),避免因为文件末尾的标记导致多读一行。 - 重新打开文件:第一次读取后文件指针到了末尾,所以需要重新打开来读取内容并存储子串和初始化数组。
- 二维数组正确初始化:先根据总行数
index计算目标行数index-6,然后创建对应大小的指针数组int** myNodes = new int*[targetRowCount];,再逐个分配每行的int数组。 - genNode函数修正:参数改为
int** x(直接接收二维数组指针),用0初始化int元素,避免类型错误。 - 字符串数组实现:创建
string* nameNodes = new string[index];,在读取每行时直接赋值子串。 - 内存清理匹配:只清理实际分配的
targetRowCount个二维数组元素,以及字符串数组。
内容的提问来源于stack exchange,提问作者Horror Symphony
相关产品推荐
相关产品推荐

