【问题标题】:Access violation looping and writing访问冲突循环和写入
【发布时间】:2011-06-02 11:24:45
【问题描述】:

好的,我已经检查了有关此的每一个问题,但我仍然无法弄清楚。我需要使用循环将字符串数组写入文件。我的阅读部分工作正常,但是当我调试时,这个部分并不具体。所以,这就是问题所在。

它给了我:访问冲突,但不能给我确切的行。 我对 c++ 很陌生,而且我不太擅长异常处理。编辑: 变量和数组在上半部分声明,但我会给出。

string bord[10][10];
string line;
int i=0,j=1;
ifstream ifile ("test.txt");
//readfile
if (ifile.is_open()){
    getline (ifile,line);
    bord[0][0].assign(line,0,1);
    cout << "i=" << i << " j=" << j<< " inhoud - " << bord[0][0] << endl;
    while (j!=11){
        getline (ifile,line);
        cout << line << endl;
        i=0;
        while (i!=10){
            bord[i][j].assign(line,i,1);
            cout << "i=" << i << " j=" << j<< " inhoud - " << bord[i][j] << endl;
            i++;
        }
        j++;
    }
    ifile.close();
}
ofstream ofile ("test2.txt", ios_base::trunc);
                    //Write File
if (ofile.is_open()){
    if(bord[0][0]=="z"){
        ofile << "zwart";
    }
    else{
        ofile << "wit";
    }
                    //START LOOPING FOR OUTPUT
    for(j=1; j<11; j++){
        ofile << endl;
        for(i=0; i<10; i++){
            cout <<  "i=" << i << " j=" << j<< " inhoud - " << bord[i][j] << endl;
            ofile << bord[i][j];
        }
    }
    ofile.close();
}

【问题讨论】:

  • 可能真正的错误在读取部分,并且数组没有在此处正确创建。
  • 和“bord”尺寸是 ?也 bord[0][0]=="z" 可能应该是 =='z'
  • 你能显示“bord”声明吗?可能外部循环范围是错误的。
  • 如果你一次写一个字符,我会期望bord[j][i]而不是[i][j]。
  • 是的,没错,但这不是我的问题。而且总是 (x,y) 所以...

标签: c++ for-loop access-violation writing


【解决方案1】:

您的外部for 循环是for(j=1; j&lt;11; j++),这意味着j 的值将是1 到10(含)。但是数组被定义为string bord[10][10],所以只有索引0到9是有效的。

将循环更改为for(j=0; j&lt;10; j++)。您还需要以相同的方式修复您的 while 循环,因为它还会为 j 提供值 1..10 而不是 0..9。

【讨论】:

  • 我的文件是这样的:z (j=0) 十行 (j 1-10) 宽度 10 (i 0-9) 文件结尾
  • 我应该把第一行写成另一个字符串吗?
  • @user780049:是的,将第一行存储在另一个变量中是有意义的,因为它与其他变量不同,并且可能具有不同的含义。您也可以将其保留在同一个数组中,但是您需要将数组大小增加到 11。
【解决方案2】:

bord 上的尺寸不正确。根据您自己的代码,它应该是 string bord[10][11]; 而不是 string bord[10][10];

while (j!=11){'. Note howj` 开头的问题在此循环中上升到 10。这意味着你的内在维度至少需要 11。

【讨论】:

    【解决方案3】:

    所以你的访问冲突是因为你越过了数组的末尾,当你用 10 定义和数组时,你有元素 0-9。另请参阅我上面的评论。

    【讨论】:

    • 好的,但是当我说 bord[9][10] 时(因为上面还有一行告诉你轮到谁了)它给了我这样一个警告/错误。
    【解决方案4】:

    其他人已经通过使用错误的索引回答了为什么您的代码无法正常工作。由于您是 C++ 新手,我想我会提供更多细节。

    C++ 中的数组由连续内存表示。例如,当您声明一个字符串数组时:string bord[10],它有效地为 10 个字符串对象分配内存。

    bord 实际上是指向该内存的指针。数组使用指针算法工作,即使用bord[4]时,它表示bord + 4*sizeof(string),这意味着在指针返回之前有4个字符串元素。因此,bord[4] 指向数组的第 5 个元素。这就解释了为什么 C++ 数组是从 0 开始的。

    现在,当声明像string bord[10][10] 这样的二维数组时,它会分配一个包含 10 个元素的数组,这些元素是 10 个字符串的数组。所以bord[1][0]在这种情况下意味着bord + 1*(sizeof(string[10]))

    如果您的索引比数组的大小更大,您将检索可能不属于您的数组的内存(记住指针算法)。这就是所谓的缓冲区溢出。

    在您的情况下,例如,当引用 bord[0][10] 时,您将真正获得 bord[1][0] 的值,因为第一个 10 个字符串数组之后的内存是另一个 10 个字符串数组,但是当引用 bord[10][0] 时,您'很可能会出现访问冲突,因为此内存不属于数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-04
      • 1970-01-01
      • 1970-01-01
      • 2017-08-23
      • 2015-08-15
      • 2020-09-04
      • 2012-12-05
      • 2013-04-15
      相关资源
      最近更新 更多