为啥代码不能打印这个二维数组的元素?

Posted

技术标签:

【中文标题】为啥代码不能打印这个二维数组的元素?【英文标题】:Why cant the code print the elements of this 2d array?为什么代码不能打印这个二维数组的元素? 【发布时间】:2018-02-06 13:49:00 【问题描述】:

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

#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;

屏幕上什么都没有。这真的很尴尬。我不明白代码有什么问题。

【问题讨论】:

首先请阅读Why should I not #include <bits/stdc++.h>? 第二件事,记住数组索引是从零开始的 最后,记住你的数组ans是一个数组的数组。这意味着ans[0][0] 不会在内存中与ans[1][0] 相邻。 这是一个想法。打印整个数组,你就会明白你的误解在哪里 1001这是一个不寻常的值。你认为你总是需要备用一个吗? 【参考方案1】:

让我们看一下内存中的一个稍微小一些的数组:

char a[3][3];

这将类似于

+---------+---------+---------+---------+--------- +---------+---------+---------+---------+ |一个[0][0] |一个[0][1] |一个[0][2] |一个[1][0] |一个[1][1] |一个[1][2] |一个[2][0] |一个[2][1] |一个[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]ans 的剩余内存将全部为零。

并且由于您使用基于 1 的索引进行打印,因此您将打印 ans[1][1]ans[1][2]ans[2][1]ans[2][2]。都是零。


哦,我看到您更新了您的问题,这意味着您将打印 ans[0][0]ans[0][1]ans[1][0]ans[1][1]。前两个字符应该是'$',而后两个仍然是零。

【讨论】:

所有 OP 必须写的是 memset(ans, '$', sizeof(ans) ); @Swift 好吧,因为它是 C++ 我宁愿推荐例如std::fill_n(&amp;ans[0][0], sizeof ans , '$'); :) 我没有说他应该写这个,尽管对于某些 C++ 实现来说,在 char 数组上使用 memset 仍然是最快的方法(填充速度明显慢)。我所暗示的是,OP 代码看起来像是一个由误解或无知引起的过度复杂化的例子。否则我完全同意 它现在工作正常。我刚刚用 sizeof(ans) 替换了 sizeof(ans)*2*2。谢谢。

以上是关于为啥代码不能打印这个二维数组的元素?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个数组到二维数组布尔值是真的?

php 比如有一个一维数组 我想给这个数组增加一个元素 这个元素是一个二维数组 该怎么写啊

这个二维数组为啥里面要有大括号呢?为啥风格成4个?难道不是4×4=16个元素吗?

二维数组名不能赋值给二级指针- -

打印出二维字符串数组的函数[重复]

C 语言数组 ( 验证二维数组内存是线性的 | 打印二维数组 | 以一维数组方式打印二维数组 | 打印二维数组值和地址 )