#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,赋于给空指针,
这样就能保证之后程序运行中不会发生错误!
所谓释放,就相当于告诉操作系统,"这块空间我不再使用了,你可以分给别人了"。
注意:
程序员手动分配的空间的首地址,一定要保留下来,
否则如果有指针偏移操作时,首地址就找不到了,就没法释放了。
操作系统不会主动回收我们手动分配的内存。
如果手动申请的内存空间,没有释放,这种现象就叫做内存泄漏。
内存泄漏一般指的是的服务器程序(常驻后台运行)!!
对于我们自己写的、简单的、运行一下就结束的程序,不会发生内存泄漏,
因为进程结束时,操作系统会回收进程占用的所有资源。
*/