lom599乐百家手机:一个疏忽引发的思考,小心使用malloc

 百家乐概况     |      2020-03-31 09:28

经验五中用到malloc()函数,我就不得不说一说它了.我在此不得不提醒大家一下:malloc()函数不是你想象中那么好用的.
在此,我就说一下本人在用malloc()函数遇到的麻烦.代码的形式大概如下:
#include<stdio.h>
#include<conio.h>
lom599乐百家手机 ,int main(void)
{
...
char **pointer=NULL;
char string[2]={1,2};
char string1[3]={1,2,3};
百家了乐八大技巧 ,char string2[4]={1,2,3,4};
...

  前几天写代码因为自己的疏忽导致一遍又一遍的Segmentation fault (core dumped)。该问题是因为strerror返回的指针指向非法的内存导致程序打印错误时崩溃。

pointer=(char**)malloc(sizeof(char*)*3);
pointer[0]=string;
pointer[1]=string1;
pointer[2]=string2;
...
...
}
以上代码只是说明,我当时编写的模块的大概情况.
当时我在编译的时侯,没有报错或者警告.但是,当我在运行程序,来验证程序是否健康时.
有时出现正常,有时出现不正常(如:程序死亡/在有些情况出WINDOWS报错).然后,我再以出错的输入数据,
按照程序的顺序往下一步一步看,没有发现什么异常.然后,又回到模块的开头重新查找,还是没有找到原因所在.
我连续找了好几遍,最终没有找到.
过了大概二三天的时间,我再次回到这个模块,试图找到原因.找了几遍还是落了个空.我就想把这个模块单独拿出来运行一下.
当我在写头文件包含(#include<>)的时侯,突然间想起来自己以前有过相似的遭遇.
大家可以想一下,问题到底出在那儿...
哦,原来是没有写#include<malloc.h>啊.malloc()函数不是默认的编译器连接为什么要写呢.
大家可以去查一下malloc()是不是只在malloc.h头文件中声明的...

  尝试数次无果,为了进度。简单粗暴的换成了perror。今天忙里偷闲,定位到了问题做个记录和分享。

因此,为了保证程序的健康,在以上给出的代码中在头文件包含中写上#include<malloc.h>,就可以了.
而在我的那个模块中extern void *malloc(unsigned);声明它是一个外部函数.因为工程中的其它文件中已经#include<malloc.h>,
所以在这个模块就需要声明一下就可以了.

  所有的坑,都是自己挖的。开始正题。

  

  1 #include<stdio.h>  2 #include<errno.h>  3 //#include<string.h>  4 int main()  5 {  6     char *perr = NULL;  7     errno = 14;  8     perr = strerror;  9     puts; 10     return 0; 11 } 

  先看代码,上述我屏蔽了#include<string.h>。如我所料,编译通过(其实有warn已经告诉你有问题了),运行崩溃了。warn如下:

  lom599乐百家手机 1

  然后加上#include<string.h>程序完美编译,完美成功执行。为什么呢?经过与人讨论和浏览stackoverflow上的帖子,以及我最终使用gcc -E预编译 gcc -Wall的验证。

  lom599乐百家手机 2

  我得到以下结论。