我是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吨。我不明白为什么它会把另外两个人放进去。
答案 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'的原因是因为高度和宽度用不正确的值定义,你恰好正在索引内存中的同一点,因为你过度运行了缓冲区你刚刚碰巧正确初始化的内存。