内存四区_栈区_堆区

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值