关于用malloc函数申请0字节内存的进一步讨论——《C语言深度解剖》笔记

来源:互联网 发布:中国象棋人机对战软件 编辑:程序博客网 时间:2024/04/28 07:02
环境:vs2008
关于malloc和free:
     malloc两次,free一次会内存泄漏,当时无现象,但机子会越来越慢;malloc一次、free两次肯定会出错。如下:

另外,对NULL可无数次的free。至于为什么,我认为free对于NULL无意义,所以free不free无所谓。如果让我来设计free函数,也这样设计,让那些蛋疼的人去纠结这样的问题,⊙﹏⊙b

《C语言深入解剖》P124
     “另位还有一个问题:用malloc函数申请0字节内存会返回NULL指针吗?
     可以测试一下,也可以去查找关于malloc函数的说明文档。申请0字节内存,函数并不返回NULL,而是返回一个正常的内存地址,但是你却无法使用这块大小为0的内存。这好比尺子上的某刻度,刻度本身并没有长度,只有某两个在一起才能量出长度。对于这一点一定要小心,因为这时候if(NULL!=p)语句校验将不起作用。“

不是无法使用,而是不能使用,(貌似差不多啊⊙﹏⊙b汗)就是你可以往这个地址存数据,但是可能就被后面别的内存分配语句分配掉给别的变量,就有被覆盖掉的可能。
         char *cp=(char *)malloc(0);        *cp= 'q';     //cp=0x0039210,看到存进去'q'了,就是ASCII为0x71


经实验所得,当你申请大小为0的内存,不存数据,然后再free它是没有问题的;
         char *cp=(char *)malloc(0);         free(cp);
                    当你往里面存了一个数据之后再free掉这个指针,就报错了~~~
         char *cp=(char *)malloc(0);         *cp= 'q';     //cp=0x0039210,为啥vs2008每次都分的这个啊?不是在栈里随机的么?看来编译器设计时不是设定随机的。         free(cp);     //最好不要没事就来挑战编译器的智商