malloc 和 free | C的学习笔记

malloc 和 free | C的学习笔记


*while(1)不是会一直执行吗,p=0;后面也没有break, 为什么会跳出循环?

malloc 和 free | C的学习笔记

  • 小张老师:
    因为内存是有限的
    你不停用malloc,没有free内存
    最终内存耗尽后,malloc会返回0
    此时p的值是0
    也就是空指针
    往空指针写入数据,就挂掉了

malloc(1)就是写入多少呢?1个字节?

  • 小张老师:
    malloc(1)就是申请一个字节的空间呀,指针p指向申请到的空间入口地址。

  • free的用法:
    malloc 和 free | C的学习笔记


那是不是初始化指针p的时候才可以指向0地址?

  • 小张老师:
    p可以指向0
    但是不能往空指针里写数据

malloc(1)申请空间就是写数据吗?
还是*p=0在写入数据

  • 小张老师:
    不是,就是申请一块内存,返回的是内存的地址
    p=malloc(1)是p指向了这块内存
    *p=0;才是往内存里写东西

malloc 和 free | C的学习笔记


  • 小张老师:
    你可以再加一句,printf("%x",p);
    就能看到申请到的地址了

malloc 和 free | C的学习笔记
malloc 和 free | C的学习笔记
那这是16进制的地址吗?
最后我要写free( p)吗?

  • 小张老师:
    所以你可以看到,你每次申请到的地址都是不一样的,但是里面的data都被你写了0
    你申请10个没事的啦
    free要放在while里面
    因为你用完就释放了,然后又没有其他程序去申请,就会一直申请到同一个内存

噢 ,我把free放进while里面之后,地址每次都是一样的耶!太酷了!!


那一般指针需要初始化为NULL吗?
malloc 和 free | C的学习笔记

  • 小张老师:
    p=NULL; 这个才是标准的
    *p=NULL; 是数据为空

最后为什么有这个 str = NULL;
malloc 和 free | C的学习笔记

  • 小张老师:
    因为指针的权限是最高的,可以不受限制修改任何内容。然后你free仅仅是释放了内存,但是str的指针,还是指向了原有的内存地址。如果此时误操作str指针,还是会去修改内存,产生野指针,所以要把str指向空。你可以在free str之后,printf str 的地址,你就会看到str还是指向了之前的内存地址。

malloc 和 free | C的学习笔记
malloc 和 free | C的学习笔记
malloc 和 free | C的学习笔记


malloc返回0之后,p才是空指针对吗?
malloc 和 free | C的学习笔记

  • 小张老师:
    是的,malloc申请不到空间之后,就返回。

malloc 和 free | C的学习笔记
那如果我这里一直有free呢?程序就会一直运行下去吧?

  • 小张老师:
    理论上你会死机
    你试试看

好的,实际上也是(于是我怂怂地按了停止键

malloc 和 free | C的学习笔记
谢谢小张老师!!!!!!!!!!!