在简单的程序中访问内存(堆)时出错

时间:2011-10-30 15:56:18

标签: c++ arrays heap-corruption

当我填充数组(doska)时一切正常,但是当我尝试打印元素时(cout<<我收到错误

   #include <iostream>
    using namespace std;
    struct doskas{
         int number;
        char ch;
    };
    int main(){
        auto doska= new doskas[8][8];
        auto ss="0abcdefgh";
        for(int i=1;i<=8;i++){
            for(int j=1;j<=8;j++){
            doska[i][j].ch=ss[i];
            doska[i][j].number=j;
            }
        }

        for(int i=1;i<=8;i++)
            for(int j=1;j<=8;j++){
                cout<<doska[i][j].ch;//ERROR
                cout<<doska[i][j].number;
            }

        system("pause");
        return 0;
    }

3 个答案:

答案 0 :(得分:4)

从0开始尝试,严格小于8,而不是从1到8。

答案 1 :(得分:1)

数组索引必须始终以0开头并以N-1结尾,其中N是数组的大小。请相应地更改所有for循环中的索引变量。像这样:

for(int i=0;i<8;i++)
{
  //etc
}

答案 2 :(得分:1)

你只需要在半开放范围[0, N)中枚举数组索引,一切都很好:

  for (int i = 0; i < 8; ++i)
  {
    for (int j = 0; j < 8; ++j)
    {
      doska[i][j].ch = ss[i];
      doska[i][j].number = j;
    }
  }

请参阅Dijkstra的famous argument,了解为什么这是考虑范围的最佳方式。