一个奇怪问题求解

hqhqhw 2004-03-31 11:05:09
char str[9]="huhaiquen";
printf("%d",strlen(str));

显示为10

char str[10]="huhaiquen";
printf("%d",strlen(str));

显示为9

为什么字符串超过字符数组的长度还能赋值?请各位大侠给个详细的说明。
...全文
24 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
junnyfeng 2004-03-31
  • 打赏
  • 举报
回复
因为你前一种定义的str不够大,放入字符串后没有字符串结束符 '\0'
strlen函数一直找到0才停止记数,它可能不后面的内存内容计进去。
-----
正解
antijpn 2004-03-31
  • 打赏
  • 举报
回复
如果你的程序里面没有其他的变量,这样的越界访问造成的危险还不算很大,如果恰好这个变量在栈的最后,那么呵呵,准备哭吧!

反正这个肯定是越界了,如果只是要知道数组的大小,可以用sizeof得到结果。否则声明的时候就不要指定大小
bjskyhorse 2004-03-31
  • 打赏
  • 举报
回复
字符串后没有字符串结束符 '\0',C自己不检查越界,而strlen函数一直找到0才停止记数,它可能不后面的内存内容计进去。
chenyuntian 2004-03-31
  • 打赏
  • 举报
回复
我的机器是9和10
angelo23 2004-03-31
  • 打赏
  • 举报
回复
应该是一种巧合吧,如果str+9的位置和str+10的位置都不是'\0',那结果又不一样了
zouxueping 2004-03-31
  • 打赏
  • 举报
回复
C中本身就不检查越界操作内存,这得程序员自己去保证,你就是很明显地用str[10],它也只有一个警告而已,如果用指针,就随便你怎么搞了。
char str[9]="huhaiquen";
printf("%d",strlen(str));
显示的也不一定就是10,大于9的任意数都有可能。
HitXU 2004-03-31
  • 打赏
  • 举报
回复
因为你前一种定义的str不够大,放入字符串后没有字符串结束符 '\0'
strlen函数一直找到0才停止计数,它可能把后面的内存内容计进去。

后一种空间够大。

“abc”字符串在内存中要在4位,最后要有结束符的。

HitXU 2004-03-31
  • 打赏
  • 举报
回复
因为你前一种定义的str不够大,放入字符串后没有字符串结束符 '\0'
strlen函数一直找到0才停止记数,它可能不后面的内存内容计进去。

yjh1982 2004-03-31
  • 打赏
  • 举报
回复
内部初始化实现是
memset(str,const char address,sizeof(str));

69,371

社区成员

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

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