为什么代码不能打印这个2d数组的元素?

时间:2018-02-06 13:49:01

标签: c++ arrays c++11 matrix cout

好的,所以我写了这段代码来打印2D数组的所有元素。但令人惊讶的是,屏幕上没有任何内容。这是代码:

#include <bits/stdc++.h>
using namespace std;

char ans[1001][1001];



void display_ans(int row,int col)
{
    for (int i=0;i<row;i++)
    {
        for(int j=0;j<col;j++)
        {
            cout<<ans[i][j];
        }
        cout<<endl;
    }
}

int main()
{
    memset(ans,'$',sizeof(ans[0][0])*2*2);
    display_ans(2,2);
    return 0;
}

屏幕上没有任何内容。这真的很尴尬。我无法理解代码的错误。

1 个答案:

答案 0 :(得分:4)

让我们看一下在内存中看起来像一个更小的数组:

char a[3][3];

这就像

+---------+---------+---------+---------+---------+---------+---------+---------+---------+
| a[0][0] | a[0][1] | a[0][2] | a[1][0] | a[1][1] | a[1][2] | a[2][0] | a[2][1] | a[2][2] |
+---------+---------+---------+---------+---------+---------+---------+---------+---------+

memset(ans,'$',sizeof(ans[0][0])*2*2);之类的调用将为四个第一个内存位置设置内存。这与我们上面的示例相同,它将是a[0][0]a[0][1]a[0][2]a[1][0]。 <... a[2][1]的内存不会被触及。

对于您的数组,ans[0][0]是第一个元素,后跟ans[0][1]a[0]之前的所有剩余999个元素a[1][0]

这会导致memset来电设置的元素为ans[0][0]ans[0][1]ans[0][2]ans[0][3]。 <{1}}的其余内存全部为零。

,因为您使用基于一个索引进行打印,所以打印ansans[1][1]ans[1][2]和{{1 }}。这些都是零。

哦,我发现您更新了问题,这意味着您将打印ans[2][1]ans[2][2]ans[0][0]ans[0][1]。前两个字符应为ans[1][0],而后两个字符仍为零。