ubuntu linux下为什么这段代码不报错

冉航--小虾米 2012-06-14 08:43:32

#include<stdio.h>
#include<string.h>

int main(void)
{
char str[5];
strcpy(str,"hello world!") //这里应该报错
printf("strcpy over");
}

gcc -o test test.c //用gcc编译
./test // 执行
strcpy over //执行结果,但是没有提示strcpy错误,在windows下VS2005里虽然也能打印出strcpy over,但

是程序会崩溃,为何在ubuntu下没有提示错误?

...全文
243 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
冉航--小虾米 2012-06-14
  • 打赏
  • 举报
回复
嗯。谢谢您的答复。非常感谢。
jackyjkchen 2012-06-14
  • 打赏
  • 举报
回复
其实就和结构化异常也不靠谱一样(关闭堆栈检查后,有时候少量越界也不报错),如果你真越界越的多了,比如你试试,5字节的缓冲区放5000字节的数据,怕就是要报segmentation fault,这个时候是不可恢复的错误,linux想让程序继续执行也不行了,因为关键的数据可能都被破坏了
冉航--小虾米 2012-06-14
  • 打赏
  • 举报
回复
但是,我看书上的例子,有的提示 segmentation fault,起码能给程序员 提示 执行中遇到了错误。

为什么这个程序不提示这样的错误呢?
jackyjkchen 2012-06-14
  • 打赏
  • 举报
回复
C的一切包袱都在程序员,按照其他高级语言的观点,C的标准库都全是bug(木有任何参数检查和类型检查),调试这种事情更不会为你负责了

应该说linux更坚守了C的这种传统,M$为了用户体验看不下去而已
冉航--小虾米 2012-06-14
  • 打赏
  • 举报
回复
但是这样的话,不是让程序员错误更难发现了吗?
jackyjkchen 2012-06-14
  • 打赏
  • 举报
回复
windows追求更早更快发现错误,他有结构化异常,对访问了系统能够觉察到的非法内存区域(比如NULL指针,比如内核区,比如加了堆栈检查后的越界),能够报错误,而且能和c++的try..catch联动,你这个错误有可能会被VC的C++异常抓到(不是绝对的,代码里不能依赖这一点)

linux则追求更高的容错性,反正保护模式下再怎么乱写也搞不死系统

意识形态不同造成的结果,windows认为一个错误的程序就不应该继续运行,否则可能扩大错误,如果错误的操作了磁盘,则可能造成不可挽回的损失;linux则希望程序只要能运行就让它运行下去,追求连续性

69,371

社区成员

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

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