前两天看到一个笔试题,关于malloc和free的,代码很简单,但是很多同学却产生的疑问。
这两个函数在C语言中经常出现,大多数人对他们的认知就是:
malloc申请内存,有了内存就能够使用;
free释放内存,释放了就不能用。
解释的基本上没错。但是有的时候会出现一些很怪异的现象,究其原因,还是没有搞清楚他们的真正用法。直接上代码。
#include #include #include int main(){ char *s = (char *)malloc(sizeof(char) * 16); memcpy(s, "hello", 6); free(s); memcpy(s, "world", 6); printf("%s\n", s); return 0;}
代码很简单,先申请一块内存,往内存里面拷贝字符串“hello”,然后释放内存,再往里面拷贝字符串“world”。这个代码按照我们正常的思维逻辑,执行到第二次拷贝的时候,应该就出现了段错误,因为内存已经被释放了,强行往里面写入数据,相当于访问了不能访问的内存,那程序肯定是挂掉了。
于是我在Redhat里面运行了一下。
结果是程序并没有死掉。
接下来我又在Ubuntu里面运行了一下。
这个才是我们想要的结果。于是,很多小伙伴又会发出一句经典的感慨:我的代码刚才还是好好的呀!
其实两个运行结果都没有问题,不同的环境、不同的编译器,处理的结果会不一样。关于malloc和free,应该明白以下几点:
malloc申请的内存,一旦申请成功,就只能为你所用,其他地方的malloc无法申请到这块内存;
free释放内存后,这块内存重获自由,程序其他地方调用malloc,有可能系统会把这块内存分配出去;
free释放内存后,这块内存里面的数据有可能变成垃圾值,有可能还是原来的数值,当然也有可能无法访问。
明白了这几点,我们在写代码的时候就要做到:
free释放掉内存后,应该将指针置为空,避免乱用;
被free掉的内存不要再去使用它,虽然有时候使用不会报错。