动态存储区(堆)、动态存储区(栈)、静态存储区、程序代码区
动态存储区(堆):(动态分配)
malloc动态分配在heap堆区。
动态存储区(堆),程序员自己分配自己释放。
动态存储区(栈):(动态分配)
自动变量、const变量在stack栈区。
动态存储区(栈),系统自动分配释放。
静态存储区:(静态分配)
extern全局变量,在static静态存储区。
静态存储区,一旦分配,不会被回收,可读可写
程序代码区:(静态分配)
main函数、其他函数在code程序代码区。
程序代码区,一旦分配,可读不可写,不可改变
堆和栈
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<stdlib.h> 5 6 main() 7 { 8 void *p1 = malloc(20); 9 void *p2 = malloc(30); 10 printf("%x,%x ", &p1, &p2);//地址在栈上 11 printf("%x,%x ", p1, p2);//在堆区 12 13 system("pause"); 14 }
栈
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<stdlib.h> 5 #include<windows.h> 6 7 main() 8 { 9 //堆,不知道要用多少内存的时候,需要手动释放 10 //堆可以处理很大的内存 11 //堆就是malloc或者realoc或者calloc分配的内存 12 13 while (1) 14 { 15 void *p = malloc(1024 * 1024 * 30); 16 Sleep(2000); 17 free(p); 18 Sleep(2000); 19 } 20 21 system("pause"); 22 }
栈
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<stdlib.h> 5 6 main() 7 { 8 //栈,用完了内存就立刻回收,再次利用 9 10 while (1) 11 { 12 double x[1024 * 50 * 200]; 13 } 14 15 system("pause"); 16 }