内存四区_栈区_堆区

来源:互联网 发布:国外教育学专业 知乎 编辑:程序博客网 时间:2024/06/06 04:33

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;
}

0 0
原创粉丝点击