为啥代码不能打印这个二维数组的元素?
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(&ans[0][0], sizeof ans , '$');
:)
我没有说他应该写这个,尽管对于某些 C++ 实现来说,在 char 数组上使用 memset 仍然是最快的方法(填充速度明显慢)。我所暗示的是,OP 代码看起来像是一个由误解或无知引起的过度复杂化的例子。否则我完全同意
它现在工作正常。我刚刚用 sizeof(ans) 替换了 sizeof(ans)*2*2。谢谢。以上是关于为啥代码不能打印这个二维数组的元素?的主要内容,如果未能解决你的问题,请参考以下文章
php 比如有一个一维数组 我想给这个数组增加一个元素 这个元素是一个二维数组 该怎么写啊
这个二维数组为啥里面要有大括号呢?为啥风格成4个?难道不是4×4=16个元素吗?
C 语言数组 ( 验证二维数组内存是线性的 | 打印二维数组 | 以一维数组方式打印二维数组 | 打印二维数组值和地址 )