strcpy 字符串结束问题

肥多罗 2008-10-20 11:08:23
void test()
{
char c_str[10];
char *p_str = "0123456789";
strcpy(c_str, p_str);
}


上面的编译怎么没出错?p_str不是还有个'\0'吗。。。。11个字符。。。。。c_str才10个字符。。。怎么没说数组越界?

thanks
...全文
181 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
肥多罗 2008-10-21
  • 打赏
  • 举报
回复
哦。。5楼解释得不错。。谢啦。。
brookmill 2008-10-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wxflul 的回复:]
char *p_str = "0123456789";

改成01234567890; 程序运行没事。。。string[10] 也值(0)

改成012345678900; 弹出对话框 越界提示。。。
[/Quote]
看来编译器给c_str分配空间的时候,实际上给了12个字节,也就是4字节对齐。换一种说法,也可以说,给了10个字节,但紧接着的2个字节没分配给别人用。
01234567890共11个字符,加上'\0',正好用了这12个字节,没事
012345678900加上'\0'就是13个字节了,于是出错了
如果是gcc编译器,通常在c_str后面还会预留更多的空间。
cattycat 2008-10-20
  • 打赏
  • 举报
回复
4楼上说得对,这需要自己去注意的。
肥多罗 2008-10-20
  • 打赏
  • 举报
回复
char *p_str = "0123456789";

改成01234567890; 程序运行没事。。。string[10] 也值(0)

改成012345678900; 弹出对话框 越界提示。。。
brookmill 2008-10-20
  • 打赏
  • 举报
回复
数组越界的问题,在C/C++是完全靠程序员自己检查的。
不但编译器不管,运行的时候也不一定出错。
比如LZ的这个程序,我觉得多半就可以不出错的运行。虽然会写到c_str的外边一个字节,很多时候这个字节刚好是没人用的
做项目最怕这种问题,调试的时候没事,给了客户就出毛病,还不好复现,很麻烦。
chlaws 2008-10-20
  • 打赏
  • 举报
回复
strcpy安全性本来不高,你要高安全性就用strncpy
AlwaysSLH 2008-10-20
  • 打赏
  • 举报
回复
编译器没有责任去检测数组越界
brookmill 2008-10-20
  • 打赏
  • 举报
回复
编译器不检查数组越界

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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