认识c语言的内存四区

前言内存四区,分别是全局区(静态区),代码区,栈区,堆区.
从内存分配来看,可以分为静态分配和动态分配.
静态分配【认识c语言的内存四区】内存分配完成之后,不会释放,直到程序结束

  1. 静态区,分配之后,不会释放,可读可写
  2. 代码区,一旦分配,可读不可写,不能修改
动态分配
  1. 栈区,系统自动分配和释放
  2. 堆区,手动分配和手动释放
看图,强化一下记忆
认识c语言的内存四区

文章插图
内存四区
全局区(静态区)int num = 10;//静态分配,不回收void show(){ int data = https://www.isolves.com/it/cxkf/yy/C/2022-03-30/15; //动态分配,离开作用域就释放,可以通过内存监视printf("%p,%p", &num, &data); //根据打印的地址,通过内存1和内存2查看全局变量和局部变量的声明周期 num = 20; data = 30; printf("n");}int main(int argc, char *argv[]){ show(); printf("nnn"); show(); system("pause"); return 0;}代码区(只读,不可写入)void code(){ printf("hello world!n");}int main(int argc, char *argv[]){//根据打印的地址0x0C71850 通过反汇编窗口 输入0x0C71850 会发现自动改为_code(),证明函数名就是地址 printf("%pn", code); char *p; scanf("%p", &p);//输入打印的地址 printf("[%c]", *p); *p = 'a';//引发了异常: 写入访问权限冲突,证明代码区是可读不可写 system("pause"); return 0;}
认识c语言的内存四区

文章插图
通过指针获取方法(地址),写入数据,报访问权限冲突
栈区void stack(int x){ //x arr在离开作用域(方法)就回被回收掉//可以在内存中, int arr[] = { 1,2,3 }; printf("%p,%pn", &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;}本文是2016.09.07,是当时学C语言记录下的笔记,本想每天写一篇博文,有些吃力,还是迁移文章来的实在.




    推荐阅读