在2d数组中设置值会导致数组中的其他值发生更改

时间:2012-08-24 02:59:06

标签: c++ arrays multidimensional-array

我是C ++的新手,我认为我缺少一些概念,因为我要做的就是在二维数组中设置一个值并且它正在搞乱。它不是仅在我指定的位置设置一次,而是将其设置在多个位置。代码在其他语言中非常有用,所以它一定是C ++的一些我不知道的怪癖?

#include <iostream>
#include <string>

int main()
{
const int width=26;
const int height=10;
char arr[width][height];
//fill with dots
std::string empty=".";
for (int i=0;i<height;i++)
{
    for (int j=0;j<width;j++)
    {
        arr[i][j]=empty[0];
    }
}
std::string msg="test";
//set location row=5, col=3 to "t"
arr[5][3]=msg[0];

//print the array
for (int i=0;i<height;i++)
{
    for (int j=0;j<width;j++)
    {
        std::cout<<arr[i][j];
    }
    std::cout<<std::endl;
}
}

结果是:

..........................
..........................
..........................
.......................t..
............t.............
...t......................
..........................
..........................
..........................
..........................

.......................... .......................... .......................... .......................t.. ............t............. ...t...................... .......................... .......................... .......................... .......................... 中间应该只有1吨。我不明白为什么它会把另外两个人放进去。

2 个答案:

答案 0 :(得分:4)

根据输出的形状,你显然使用10的高度和26的宽度。

您将数组引用为[i][j],其中i是垂直的,j是水平的,但在这种情况下,数组定义为26行10列。所以当你打印出来时,你会溢出它。该数组只是一个连续的内存块,因此不会溢出该块。否则你会崩溃。但这是不正确的。

您的行当前是10个字符,但您正在访问,就像它们是26一样。这意味着您从接下来的2行中获取值。输出中的额外“t”值是在它们之前的行中溢出的结果。

希望这是有道理的。

将访问权限更改为arr[j][i],或将访问权限更改为char arr[10][26]

答案 1 :(得分:3)

它与您如何定义高度宽度有关。

由于您未在示例代码中提供您正在使用的值,因此我尝试了两种选项。

使用:

int  height = 10;
int  width = 26;

您获得了上述行为。

但是:

int  height = 26;
int  width = 10;

你得到了正确的行为,你多次看到't'的原因是因为高度和宽度用不正确的值定义,你恰好正在索引内存中的同一点,因为你过度运行了缓冲区你刚刚碰巧正确初始化的内存。