malloc 和 free | C的学习笔记
*while(1)不是会一直执行吗,p=0;后面也没有break, 为什么会跳出循环?
-
小张老师:
因为内存是有限的
你不停用malloc,没有free内存
最终内存耗尽后,malloc会返回0
此时p的值是0
也就是空指针
往空指针写入数据,就挂掉了
malloc(1)就是写入多少呢?1个字节?
-
小张老师:
malloc(1)就是申请一个字节的空间呀,指针p指向申请到的空间入口地址。 -
free的用法:
那是不是初始化指针p的时候才可以指向0地址?
-
小张老师:
p可以指向0
但是不能往空指针里写数据
malloc(1)申请空间就是写数据吗?
还是*p=0在写入数据
-
小张老师:
不是,就是申请一块内存,返回的是内存的地址
p=malloc(1)是p指向了这块内存
*p=0;才是往内存里写东西
-
小张老师:
你可以再加一句,printf("%x",p);
就能看到申请到的地址了
那这是16进制的地址吗?
最后我要写free( p)吗?
-
小张老师:
所以你可以看到,你每次申请到的地址都是不一样的,但是里面的data都被你写了0
你申请10个没事的啦
free要放在while里面
因为你用完就释放了,然后又没有其他程序去申请,就会一直申请到同一个内存
噢 ,我把free放进while里面之后,地址每次都是一样的耶!太酷了!!!
那一般指针需要初始化为NULL吗?
-
小张老师:
p=NULL; 这个才是标准的
*p=NULL; 是数据为空
最后为什么有这个 str = NULL;
-
小张老师:
因为指针的权限是最高的,可以不受限制修改任何内容。然后你free仅仅是释放了内存,但是str的指针,还是指向了原有的内存地址。如果此时误操作str指针,还是会去修改内存,产生野指针,所以要把str指向空。你可以在free str之后,printf str 的地址,你就会看到str还是指向了之前的内存地址。
malloc返回0之后,p才是空指针对吗?
-
小张老师:
是的,malloc申请不到空间之后,就返回。
那如果我这里一直有free呢?程序就会一直运行下去吧?
-
小张老师:
理论上你会死机
你试试看
好的,实际上也是(于是我怂怂地按了停止键
谢谢小张老师!!!!!!!!!!!