求解

li905663280 2014-07-10 07:01:06

#include "stdio.h"
void main()
{
char a[6]="bacao";
char b[]="bbd";
strncat(a,b,3);
printf("%s",a);
getch();
}

数组,为什么不报错,,
...全文
112 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
疏可跑马 2014-07-11
  • 打赏
  • 举报
回复
自古二楼出正解。
万俟宇轩 2014-07-11
  • 打赏
  • 举报
回复
这样的话是不是只能自己查错了?
wu424602394 2014-07-11
  • 打赏
  • 举报
回复
char a[6]="bacao"; char b[] ="bbd"; strncat(a,b,3) 这里 a,b 是以地址传给它的,它不会检查你a具体有多少个元素的,所以不会报错,在strncat函数里面接连时应该是以地址++方式连接,也不检测数组大小,编译器一般是连续分配内存 所以b紧接在a后面, 内存内容为 bacao'\0'bbd'\0' strncat(a,b,3); 会自动把a 字符串的 结束标志'\0'去接, 接上bbd 所以内存内容为 bacaobbd'\0' printf("%s",a); 是以是a[0]地址开始一直到检测到'\0'才作为结束标志的,所以输出bacaobbd
707wk 2014-07-11
  • 打赏
  • 举报
回复
c编译器不会对数组越界进行检查
阿呆_ 2014-07-11
  • 打赏
  • 举报
回复
呵呵,如果你再printf("%s",b); 就会发现b也变了(如果是release版的话),变成空字符串了。 因为a和b都是栈上的变量,a占用8字节栈空间,后面紧接着是b占用的4字节空间,所有当你strncat后b[0]就成了'\0‘了
赵4老师 2014-07-11
  • 打赏
  • 举报
回复
其实电脑开机后物理内存的每个字节都是可读写的,区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。
  • 打赏
  • 举报
回复
楼上已经解答。
羽飞 2014-07-10
  • 打赏
  • 举报
回复
数组越界并不是一定会报出错误,所以这种错误是隐藏最深,最让人头疼和蛋疼的

69,336

社区成员

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

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