内存四区_栈区_堆区

1.栈区
        栈(stack)是一种先进后出的内存结构,所有的自动变量,函数的形参都是由编译器自动放出栈中,当一个自动变量超出其作用区域时,自动从栈中弹出。
        对于自动变量,什么时候入栈,什么时候出栈不需要程序控制,是由C语言编译器实现。
        栈不会很大,一般以K为单位
1.1栈溢出
当栈空间已满,继续往栈内存放变量,这个就叫栈溢出。
对于一个32位的操作系统,最大管理4G的内存,其中1G是留给操作系统自己的,剩下的3G是给用户程序,一个用户程序理论上可以使用3G的内存空间。如果自己写的程序要使用很大的内存空间的话,就要使用堆。

//democ 演示栈区溢出
#include 
 
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 
#include 
#include 


void printf_array(int *p,int n) //打印数组函数
{
   int i;
   for(i=0;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;
}

 
  

 
  

你可能感兴趣的:(内存四区_栈区_堆区)