关于 char [5] 和 char [6]

wlgc123321 2010-11-25 10:46:02
char a[5] = "hello";
char a[6] = "hello";
我知道这个会少个\0
可是我试了下好像两个都可行
mingw编译 运行
有请高人!
...全文
215 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZXW0521 2010-11-25
  • 打赏
  • 举报
回复
char a[5] = "hello";

然后a+5的地址刚好是0,
这次就输出对了,

如果某次运行,这个地址不为0,那就会打印出一些乱码
dingshaofengbinbin 2010-11-25
  • 打赏
  • 举报
回复
有意义吗??
hai040 2010-11-25
  • 打赏
  • 举报
回复
char a[5] = "hello";
不是说不放'\0'
而是把0放到申请的空间后面,写了其它人的数据

这里没出错可能是因为内存对齐
换4或8长度的字符串试试
wanghang8888 2010-11-25
  • 打赏
  • 举报
回复
你定义一个char a[5]={'a','b','c','d','e'};再输出cout<<a;就出错了,因为没有‘\0’.
zoudaokou2006 2010-11-25
  • 打赏
  • 举报
回复
MINGW我不知道。
但VS我跟踪过内存。
一般编译器都会做一些保护字节(另一个重要的原因是变量对其到特定值倍数字节,可以提高程序效率)
比如这里的char a[5] = "hello";
虽然你申请了只有5个字节,但是编译器可能会多出了几个字节给你做保护,如果这几个字节恰好又被初始化为0x00的话,好叻,你中彩票了。
虽然中彩票的几率蛮高,还是不要做这种操作,第一,本身就是错误;第二,即使侥幸不出事,你的代码依赖于编译器的特定行为,代码也丧失了可移植性;第三,这种代码,你让其他维护人员情何以堪啊,呵呵~~
zhutianjin4355255 2010-11-25
  • 打赏
  • 举报
回复
数组越界编译器不会报错,万一越界的内存存放着关键值,将会给楼主带来不可预料的后果
至善者善之敌 2010-11-25
  • 打赏
  • 举报
回复
你记住遇到CHAR 类型的多申请一个给\0就可以了
aining0809 2010-11-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yyg990441 的回复:]

某次运行正确,或者在某个特殊的编译器上运行正确不代表这个程序就正确.

就好象某次我买彩票中了100万,不代表我每次买都会中100万.
[/Quote]
同意!!

编译器的问题。
VC6.0会报错(error C2117: 'hello' : array bounds overflow)
GCC不会报错,但结果肯定不是你预期的。
wlgc123321 2010-11-25
  • 打赏
  • 举报
回复
嗯,谢谢以上各位回答
嗯 遵守规则
我只是好奇 一时找不到出错的例子
书上说会一直读取直到遇到\0为止 可是我这样写
char a[5] ="hello";
int age = 18;
char name[9]="zhangsan";
printf("%s\n",a);
也只打印hello 没有一直读到zhangsan
luciferisnotsatan 2010-11-25
  • 打赏
  • 举报
回复
是都可以编译运行。但第一个会溢出

debug模式下,变量之间会有些数据填充,可能发现不了错误。release模式下,就有可以出错。
Jesusgospelnj 2010-11-25
  • 打赏
  • 举报
回复
同意,内存在那,关键是你是否去访问,
無_1024 2010-11-25
  • 打赏
  • 举报
回复
最好遵守规则 都有'\0'但是第一个有内存溢出
yyg990441 2010-11-25
  • 打赏
  • 举报
回复
某次运行正确,或者在某个特殊的编译器上运行正确不代表这个程序就正确.

就好象某次我买彩票中了100万,不代表我每次买都会中100万.
wlgc123321 2010-11-25
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 hai040 的回复:]

char a[5] = "hello";
不是说不放'\0'
而是把0放到申请的空间后面,写了其它人的数据

这里没出错可能是因为内存对齐
换4或8长度的字符串试试
[/Quote]
嗯 谢谢 我换成4 终于找到出错的例子了!!
赵4老师 2010-11-25
  • 打赏
  • 举报
回复
试试这个看输出什么:
char a[8] = "12345678";
char b[6] = "hello";
printf("%s,%s\n",a,b);

69,382

社区成员

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

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