1.输入数据
在c99以前我们用动态内存分布.malloc返回的是void*,它的原型是malloc(size_t,size),所以我们要把它强制转化为int*.另外,我们要用这个malloc函数首先要包含<stdlib.h>.接下来我们看怎么来用这个malloc.
我们这段代码的意思是,用a来申请number个int的空间,然后遍历数组a,最后free a申请的那片空间.
2.malloc函数
在内存里头计算机才不会care你是int或者double,对它来说内存就是一片连续的空间,是我们自己说这个地方是int,这个地方是double.malloc要做的事情很简单,就是跟计算机要块内存来.
3.没空间了
空间总是有限,如果空间用完了,malloc会给你什么?如果申请失败则返回0,或者NULL.我们不妨来试一下我们的计算机能给我们多少空间:
#include<stdio.h>
#include<stdlib.h>
int main(){
int cnt=0;
void *p;
while((p=malloc(100*1024*1024))){
cnt ++;
}
printf("分配了%d00MB的空间\n",cnt);
free(p);
free(NULL);
return 0;
}
结果如下:
不同计算机在不同的环境下会申请到不同的空间.
4.free函数
我们来试试把这个首地址++:
我们的编译器给了我们一个error.它说要释放的那个指针不是申请来的.还有什么是不可以的?
我们free的这个p不是原来的p,而是另外变量的地址,所以也不行.看起来这个系统会记住它给过你什么.然后你还的时候必须原封不动的还给人家.它给你的地址是什么,你就拿那个地址去还给人家才是对的.那假如你说我一不小心free了NULL了?没问题.反正0不可能是一个有效的地址对不对,0不可能是一个你malloc得到的地址.所以如果我们给free一个NULL,free会判断一下说这是个NULL,那我就干脆不做事情了.可是有什么必要我们要做这样的事情呢,因为我们其实良好的习惯是,有一个指针出来了,我就先初始化它为0,任何的指针一定义就初始化它为0,那么在这之后如果你没有去malloc,或者你malloc得到一个失败的结果,你在这想要去free那个p,这都没问题.
5.常见问题
- malloc申请了没free.坦率地说,如果你只是写个小东西哈,我要读个number,然后根据这个number申请一个数组,读点东西做点运算,然后走掉了, 坦率地说,如果在这样的程序里头,你malloc了,没有free不会对任何人造成伤害的.因为你的程序运行的过程中所造成的任何不好的东西,我们说如果你malloc了没有free,你会留下的是什么呢,我们把它叫做内存漏洞或者叫做内存垃圾,这种东西没关系,当你的程序运行结束的时候,哗啦一下子全没了.操作系统有它的机制去保证,当这个程序运行完成以后,它曾经使用过的所有的内存,都会被清除干净的.所以留下没有free的东西对于小程序来说没问题.但是这是一个坏习惯,有一天你去做大程序的时候,我们就会遭殃.
有四种可能:
解决的办法:第一,牢牢地记住free,在你的程序一旦有malloc,就给它对上一个free,第二,你需要对你程序的架构有一些比较良好的设计,保证你的程序能够有恰当的时机去free它们,第三,当然这需要经验,需要多阅读别人写的代码,需要多写自己的代码,需要多在失败当中总结教训,然后不断地成长,光是读书是没有用的,编程是实践,所以纸上得来终觉浅,绝知此事要躬行