做catia数据的网站,潮牌衣服网站建设可行性分析,iis7站长工具,搭建html5网站前几天写代码因为自己的疏忽导致一遍又一遍的Segmentation fault (core dumped)。该问题是因为strerror#xff08;errno#xff09;返回的指针指向非法的内存导致程序打印错误时崩溃。 尝试数次无果#xff0c;为了进度。简单粗暴的换成了perror(str)。今天忙里偷闲#x… 前几天写代码因为自己的疏忽导致一遍又一遍的Segmentation fault (core dumped)。该问题是因为strerrorerrno返回的指针指向非法的内存导致程序打印错误时崩溃。 尝试数次无果为了进度。简单粗暴的换成了perror(str)。今天忙里偷闲定位到了问题做个记录和分享。 所有的坑都是自己挖的。开始正题。 1 #includestdio.h2 #includeerrno.h3 //#includestring.h4 int main()5 {6 char *perr NULL;7 errno 14;8 perr strerror(errno);9 puts(perr);10 return 0;11 } 先看代码上述我屏蔽了#includestring.h。如我所料编译通过其实有warn已经告诉你有问题了运行崩溃了。warn如下 然后加上#includestring.h程序完美编译完美成功执行。为什么呢经过与人CSDN某某某讨论和浏览stackoverflow上的帖子以及我最终使用gcc -E预编译 gcc -Wall的验证。 我得到以下结论。 1.strerror函数声明在string.h头文件里我以前以为是在errno.h里的还是基本功不行啊。 2.gcc编译时如果发现未定义的函数它会认为该函数是定义在其他源文件中的所以编译是通过的。 但是因为编译器看不见函数原型所以它认为函数返回值为int。在链接阶段如果找到该函数则通过找不到则报错。 这里我做了个实验如果函数原型在.o文件里链接后没有问题连接器会修正返回值类型。但是如果链接的是.so文件则返回值就是int。我也想不明白。 揭晓答案吧我的程序为什么会报错呢这是一系列疏忽大意加基本功不扎实的恶果。 因为我没有包string.h。所以编译器看不见函数原型默认函数返回值为int。并给出了waraassignment makes pointer from integer without a cast用一个int型给指针赋值而没有转换--英文不好。显而易见在64位系统中char*是64位的int是32位。所以相当于我用32位的整型值当作地址赋值给了指针。所以指针指向非法内存。接着Segmentation fault (core dumped)就登场了。 系统中类型于strerror这种返回指针的函数都可能有类似问题所以头文件该包的还是要包上。该注意的warn还是不容忽视啊。 文章到此已经结束给个附录。64位系统 gcc编译器 各个数据类型长度表。 以上阐述由非权威人士撰写。如有大牛深谙其理欢迎跟帖深入说明。转载于:https://www.cnblogs.com/acool/p/4708483.html