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

环境: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);     //最好不要没事就来挑战编译器的智商





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值