2 gms1995 gms1995 于 2015.06.12 17:59 提问

对结构体中的二维数组赋值为何会影响下一排

#include "stdio.h"
struct qipan
{
char point[20][80];
bool isClear;
};
qipan board;
int main()
{
for(int i=0;i<=19;i++)
for(int j=0;j<=79;j++)
board.point[i][j]=' ';
board.point[1][1] = board.point[1][2]=board.point[1][3]='*';
//board.point[1][2] = '*';
}

代码如上,在不要for循环的时候可以将其正确初始化,但是加入了for循环对每一个都先赋空值的时候,再执行,会在point[0]中出现3个*在point[1]中也会有三个*
求教,为什么会出现这种情况?

3个回答

a1193561652
a1193561652   Rxr 2015.06.12 18:08
已采纳

point[0]中出现3个‘*’是什么意思,point不是个2维数组吗?point[0]算什么?而且point是char型数组,怎么会在一个元素里有3个字符?

gms1995
gms1995 嗯嗯,我原来观察的变量弄得搞错了,原来直接用二维数组也会这样。谢谢
2 年多之前 回复
a1193561652
a1193561652 回复优雅随风: 但是,字符数串是遇0才停的。
2 年多之前 回复
gms1995
gms1995 而且如果这个二维数组不在结构体内部的话,这样做是可以的,可以正确的赋值并且不会影响到point[1]
2 年多之前 回复
gms1995
gms1995 你的意思我大概明白了,可是这在内存中不是连续分布的吗,point[0]应该只有80个char类型的大小,为什么会显示所有的?
2 年多之前 回复
a1193561652
a1193561652 回复优雅随风: 明白了,那个列表里的是以point[n]为地址的字符串的值,如果不初始化为空格那么开头就是0,那么一开头就结束了,所以这样point[1]也显示是""。如果初始化为空格,那么point[0]显示的就是整个数组字符串。那个***是第二行的字符。
2 年多之前 回复
gms1995
gms1995 啊。。。。谢谢了
2 年多之前 回复
a1193561652
a1193561652 回复优雅随风: 那感觉就是这个自动窗口显示方面的问题,实际并没有***。
2 年多之前 回复
gms1995
gms1995 是的,加了那个for的赋值语句,初始全部赋值空格
2 年多之前 回复
a1193561652
a1193561652 回复优雅随风: 我把point[0]左边的+号打开,看到里面的80项,发现全是空格,你看看是不是。
2 年多之前 回复
gms1995
gms1995 不好意思,描述不清楚,提问的时候好像上不了图片,我在评论上了一张图片
2 年多之前 回复
gamefinity
gamefinity   Rxr 2015.06.12 20:20

看了@纵横车的解释,很到位。
补充一点,对于C/C++这样的"中级预言"来说,变成语言并没有@优雅随风 你想像的那样智能.也就是说,对一个数组(指针)系统并不知道它开了多少的内存,只知道其实位置在哪里.怎么避免使用到你没有申请的内存,是程序员的工作.这点和C#,Java之类是不一样的.
例如,在本例中,并不是你想的point[0]只有分配了80个字节.其实,字节一直在那里,你可以一直用下去,但是,用到不是本变量的值,就会影响别的变量(如本例);用到未分配的内存,就会引起段错误.

gms1995
gms1995 嗯嗯,还是要看使用的方法。了解了
2 年多之前 回复
gamefinity
gamefinity 回复优雅随风: 不是的.你在C里面指定的大小只是提供给操作系统,以避免你使用出界.但是你在你的程序里面是怎么使用,是这个变量的内存给另一个变量使用还是怎么样,操作系统是不会管的,而C语言本身也不管这回事,因此只有你自己去管理
2 年多之前 回复
gms1995
gms1995 那可否说:理论上,如果在一开始就指定了大小,就可以避免这种情况?
2 年多之前 回复
gms1995
gms1995   2015.06.12 18:14

图片说明 就是会出现这种情况

Csdn user default icon
上传中...
上传图片
插入图片