1.栈区
栈(stack)是一种先进后出的内存结构,所有的自动变量,函数的形参都是由编译器自动放出栈中,当一个自动变量超出其作用区域时,自动从栈中弹出。
对于自动变量,什么时候入栈,什么时候出栈不需要程序控制,是由C语言编译器实现。
栈不会很大,一般以K为单位
1.1栈溢出
当栈空间已满,继续往栈内存放变量,这个就叫栈溢出。
对于一个32位的操作系统,最大管理4G的内存,其中1G是留给操作系统自己的,剩下的3G是给用户程序,一个用户程序理论上可以使用3G的内存空间。如果自己写的程序要使用很大的内存空间的话,就要使用堆。
//democ 演示栈区溢出 #include <stdio.h> int main() { /*默认定义一个自动变量(auto)数组,大小为100M,栈区存放auto变量,由于定义超出了的栈的大小,溢出 一般栈的大小是以K为单位的,与操作系统大小有关,随编译器自动分配大小*/ char array[1024*1024*100]={0}; array[0]='a'; printf("%s\n",array); return 0; } |
2.堆堆heap和栈一样,也是一种在程序运行过程中可以随时概念内存空间的区域,但是堆没有栈那样要求先进后出的顺序。堆可以看成是一个很大的容器,他的空间要远远大于栈,但是在堆使用过程中一定要手动释放被申请的内存空间,否则会发生内存泄漏,即malloc和free要成对使用,而栈不需要通过程序来释放内存。
#include <stdio.h>#include <stdlib.h>#include <string.h> void printf_array(int *p,int n) //打印数组函数{int i;for(i=0;i<n;i++)printf("p[%d]=%d\n",i,p[i]);}
int main() { int array[100]={0}; //定义一个栈数组函数 int *p=(int*)malloc(sizeof(int)*10);//在堆中申请内存,内存大小为40个字节; //malloc()返回无类型的函数,可以用任何类型去指向它,也可以强转。注意:malloc一定和free成对使用,否则发生内存泄漏。 memset(p,0,sizeof(int)*10); int i=0; for(i=0;i<10;i++) { p[i]=i; } printf_array(p,10); char *p1=malloc(sizeof(char)*10); free(p); //释放通过malloc申请的堆内存空间 free(p1); //释放通过malloc申请的堆内存空间 return 0; } |