C语言中的二维数组的实际长度与给定长度

fengtianyiyun 2011-05-19 03:10:45
我写了个关于二位数组的小实验。如下:
#include <stdio.h>
void main(){
char a[][3]= {"nihao1","buhao","dajie"};
printf("%s %s %s \n",a[0],a[1],a[2);
}

编译通过的结果如下:

nihbuhdaj buhdaj daj

为什么不是
nihao1 buhao dajie

本人感觉是因为长度我规定的是3.但是为什么a[0] 是nihbuhdaj,a[1]、 a[2] 逐级递减

如果我把第二个长度规定为20,即a[][20],实际输出的结果就是nihao1 buhao dajie
这其中原因是为什么呢
...全文
566 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
tlg233418 2011-05-22
  • 打赏
  • 举报
回复
15楼的说法还是很给力的,这就是一个字符型数组的问题。
bruce_sha 2011-05-22
  • 打赏
  • 举报
回复
C 不检查数组边界的,你的数组定义越界了。
mypwb 2011-05-21
  • 打赏
  • 举报
回复
LZ 二维数组在内存中也是按一维数组来存的 数组在内存中是连续存放的,之所以会出现你那个答案我给你分析一下吧 char a[][3]= {"nihao1","buhao","dajie"};
我先说过二维数组在内存中也是按一维放的
那么上面的二维数组等同于b[9](应当b的地址和&a[0][0]相等),
b[0~6]放你第一个字符串,
然后第二个字符串从a[1][0]放即b[3]开始放
因此覆盖前面的b[3~6]一直放到b[7]
第三个字符串从a[2][0]即b[6]开始放 和前面一样不说
所以输出a[0]应是你上面第一个字符串,因为b[0]~b[8]都没有'\0',b[9]之后越界可能乱码
如此美丽的你 2011-05-21
  • 打赏
  • 举报
回复
楼主太乱来了!!!想让系统崩溃吗??????????
  • 打赏
  • 举报
回复
基础问题,我也有点糊涂
w3562163 2011-05-21
  • 打赏
  • 举报
回复
数组所分的不够大.
AnYidan 2011-05-19
  • 打赏
  • 举报
回复
lz 这样看看,也有规律

char a[][2]= {"nihao1","buhao","dajie"};
char a[][4]= {"nihao1","buhao","dajie"};
char a[][5]= {"nihao1","buhao","dajie"};


数组是连续存储的,你越界读取,但编译器仍按你给的规格读取连续存储的内存
fengtianyiyun 2011-05-19
  • 打赏
  • 举报
回复
各位都回答的很好,但我更喜欢6楼的回答,问题的本质需要探讨根本。谢谢大家的支持,数组越界了,但仍旧能读出来,并且还很有规律,那需要看汇编和C的联系,我是这么理解的。看是否还有不同意见的吗?如果没有我要结贴了
cqltwslt 2011-05-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hu7324829 的回复:]
你对数组的理解不够深入啊.
char a[3][7]= {"nihao1","buhao","dajie"};
a是一个[3]数组,它的每个元素又是类型为char [7]的数组

char *a[3] = {"nihao1","buhao","dajie"};这样定义不知道你能理解不
[/Quot
改为:#include <stdio.h>
void main(){
char a[][7]= {"nihao1","buhao","dajie"};
printf("%s %s %s \n",a[0],a[1],a[2]);
}
照你那样数组越界了啊!
我真的是琦琦 2011-05-19
  • 打赏
  • 举报
回复
char[3][]吧~~~~
shenchenman 2011-05-19
  • 打赏
  • 举报
回复
什么编译器,我咋通不过
赵4老师 2011-05-19
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”
tt2com 2011-05-19
  • 打赏
  • 举报
回复
我比较奇怪为啥子你这么写,编译器可以通过
w3562163 2011-05-19
  • 打赏
  • 举报
回复
char a[][3]是字符的怎么可以读出那么多
hu7324829 2011-05-19
  • 打赏
  • 举报
回复
你对数组的理解不够深入啊.
char a[3][7]= {"nihao1","buhao","dajie"};
a是一个[3]数组,它的每个元素又是类型为char [7]的数组

char *a[3] = {"nihao1","buhao","dajie"};这样定义不知道你能理解不
qq120848369 2011-05-19
  • 打赏
  • 举报
回复
3怎么能装下那么长的字符串。。
char a[][3]表示你将存储若干个字符串,每个字符串长度0..2之间.
就想叫yoko 2011-05-19
  • 打赏
  • 举报
回复
3个字节你写多了内容就越界写了
很可能崩溃
读时是遇到'\0'结束
也是越界读

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧