1

我是 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......................
..........................
..........................
..........................
..........................

中间应该只有 1 t。我不明白为什么要放其他 2 t。

4

2 回答 2

4

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

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

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

希望这是有道理的。

将访问arr[j][i]或定义更改为char arr[10][26]

于 2012-08-24T03:13:24.217 回答
3

它与您定义heightwidth的方式有关。

由于您没有给出您在示例代码中使用的值,我尝试了这两个选项。

和:

int  height = 10;
int  width = 26;

你得到你上面描述的行为。

但是:

int  height = 26;
int  width = 10;

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

于 2012-08-24T03:12:55.833 回答