鱼C论坛

 找回密码
 立即注册
查看: 4001|回复: 8

关于数组结束标志'\0'的问题

[复制链接]
发表于 2011-9-17 22:32:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
char abc[5]="abcdf";
puts(abc);
书上说“C系统会在存储字符串常量时,会自动加入一个‘\0’作为结束符”
但是abc数组五个字节的空间全初始化了,\0是放在哪呢?

是在abc数组的最后一个字符的地址下一个地址存储\0吗?
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2011-9-17 22:41:54 | 显示全部楼层
换一个说法

char abc[5]="abcdf";
puts(abc);
程序在执行PUTS时,如何知道字符串输出结束?
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-9-18 01:03:32 From FishC Mobile | 显示全部楼层
我并不能权威的给你答案,但可以分享一下,我所知道的部分。对于没有结束符号的字符串,他会打印“abcdf”后跟着一些乱码,他会把随后的内存中所有内容全部打印,直到刚好碰到结束符号为止。
欢迎讨论。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-9-18 12:58:07 | 显示全部楼层
如果你已经指定了数组的大小并且你把数组填满了,那么就没有空间存放  '\0' 了。
比如:char strtt[5]="abcde";  那么实际大小是5个字节,也就没有空余的地方让编译器存放'\0 了'.

如果是这样: char strtt[]="abcde";  那么实际字符串数组的大小是 6个字节(自动在结尾增加'\0').

总结: 当你初始化字符串数组时,如果有足够的空间那么编译器会自动将后面的空间初始化为'0'.
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-9-18 23:54:53 | 显示全部楼层
同意三楼的
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-9-19 15:27:30 | 显示全部楼层
如果字符数多于下标界限,会出现乱码;
建议楼主最好不要这样写,或者直接写成这样char[]="abcdf";
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-9-20 11:52:14 | 显示全部楼层
下标越界,   vc的编译器回报错,不报错就像三楼说的, 直到碰到结束符, 这样做很危险。char[]="abcdf";
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-9-22 21:12:11 | 显示全部楼层
数组越界,C编译器本身不会去检查数组越界问题,所以'\0',被放在a[4]的下一个大小为1个字节的地址中,这样很危险,如果下一个地址中存有重要的数据,将被‘\0’覆盖。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-9-23 10:24:51 | 显示全部楼层
大家都说了大概了。。我来补充一点吧!
char abc[5]="abcdf";
这样写编译器会报错吧!大家都知道。。。
"abcdf"这是字符串常量。。。在程序中有一块常量区域专门存储,这些你看得见。知道是什么值的地方。。。
用双引号来表示字符串。。。编译器会自动为字符串添加'\0'结束符的。。。所以:
"abcdf" ==
char str[6];
str[0]='a';
str[1]='b';
str[2]='c';
str[3]='d';
str[4]='f';
str[5]='\0';// '\'(斜杠是转义字符。。你懂得。。)其实str[5]=0;
所以。。。没所以了。。。。
:lol我表达能力有限。。。
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-8 05:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表