认识c语言的内存四区
内存四区
内存四区,分别是全局区(静态区),代码区,栈区,堆区. 从内存分配来看,可以分为静态分配和动态分配.
静态分配 内存分配完成之后,不会释放,直到程序结束
- 静态区,分配之后,不会释放,可读可写
- 代码区,一旦分配,可读不可写,不能修改
动态分配 内存使用完成以后,可以被回收在使用
- 栈区,系统自动分配和释放
- 堆区,手动分配和手动释放
看图,强化一下记忆

全局区
int num = 10; //静态分配,不回收
void show()
{
int data = 15; //动态分配,离开作用域就释放,可以通过内存监视
printf("%p,%p", &num, &data); //根据打印的地址,通过内存1和内存2查看全局变量和局部变量的声明周期
num = 20;
data = 30;
printf("\n");
}
int main(int argc, char *argv[])
{
show();
printf("\n\n\n");
show();
system("pause");
return 0;
}
代码区
void code()
{
printf("hello world!\n");
}
int main(int argc, char *argv[])
{
printf("%p\n", code); //根据打印的地址0x0C71850 通过反汇编窗口 输入0x0C71850 会发现自动改为_code(),证明函数名就是地址
char *p;
scanf("%p", &p); //输入打印的地址
printf("[%c]", *p);
*p = 'a'; //引发了异常: 写入访问权限冲突,证明代码区是可读不可写
system("pause");
return 0;
}
栈区
void stack(int x)
{
//x arr在离开作用域(方法)就回被回收掉
int arr[] = { 1,2,3 };
printf("%p,%p\n", &x, &arr);
}
int main(int argc, char *argv[])
{
stack(1);
system("pause");
return 0;
}
堆区
void heap()
{
//手动在堆区分配10兆
void *ptemp = malloc(1024 * 1024* 10);
if (ptemp!=NULL)
{
//根据分配好的地址,释放分配的内存,可以通过任务管理器监视程序所占内存
free(ptemp);
}
}
int main(int argc, char *argv[])
{
heap();
printf("\n");
heap(); //查看任务管理器,看运行内存大小
system("pause");
return 0;
}
本想通过录屏生成gif图,没找到合适的工具的,等找到合适的工具在补一篇
秋风
2016-09-07