关于动态内存分配malloc的初级用法和注意事项

#include <stdio.h>

#include <stdlib.h>

int main(int argc, const char *argv[])

{

   /*your code*/

    int *m_p = NULL;

     /*

        C语言中m_p里面是随机值,在int *m_p=NULL,这个m_p是有值的,为NULL;

        int *m_p=NULL指向一个空指针,等于 int *m_p=0; NULL等于0;

        可以随时让这个m_p指向其他地址。定义指针,将它初始化为NULL,这样做编程更规范。

        */

    //malloc中指针本身存储是系统自动分配 存在栈区 而指针指向的内容是存在堆区

    m_p = (int*)malloc(sizeof(int));

    *m_p = 1000;

    printf("*m_p = %d\n",*m_p);

    printf("m_p = %p\n",m_p);

    free(m_p); //m_p指向的空间的值释放 可以看成*m_p=NULL

    //free()释放的是指针指向的空间内存,不是指针 是把*p的值变为空

    printf("*m_p = %d\n",*m_p);

    printf("m_p = %p\n",m_p);

    m_p = NULL;

    //指针这个变量的值还存在 所以要 p=NULL 让指针也为空

    //不free() 直接p=NULL 这样显示空间的值(%d,*p)会产生段错误 而p的地址%p依然显示NULL

    //printf("*m_p = %d\n",*m_p);

    //printf("m_p = %p\n",m_p);

    //只free(m_p) 不m_p=NULL 则*p还能被赋值

    //int a = 4000;m_p = &a;

    //*m_p = 3000;

    //printf("*m_p = %d\n",*m_p);

    //printf("m_p = %p\n",m_p);

    return 0;

}

/*

动态内存分配malloc的初级用法和注意事项

所以free()函数释放的是指针指向的空间内存,将原本我们赋予的值清空,指针作为一个变量,

只有到程序结束时才会被销毁,原来指向这块空间的指针p仍然存在,如果有其他指针q指向了该内存空间,

就可能误用指针p来修改这里的值,因此用完free§之后,我们要将p = NULL,赋于给空指针,

这样就能保证之后程序运行中不会发生错误!

所谓释放,就相当于告诉操作系统,"这块空间我不再使用了,你可以分给别人了"。

注意:

程序员手动分配的空间的首地址,一定要保留下来,

否则如果有指针偏移操作时,首地址就找不到了,就没法释放了。

操作系统不会主动回收我们手动分配的内存。

如果手动申请的内存空间,没有释放,这种现象就叫做内存泄漏。

内存泄漏一般指的是的服务器程序(常驻后台运行)!!

对于我们自己写的、简单的、运行一下就结束的程序,不会发生内存泄漏,

因为进程结束时,操作系统会回收进程占用的所有资源。

*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值