内存四区_栈区_堆区
来源:互联网 发布:国外教育学专业 知乎 编辑:程序博客网 时间: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
- 内存四区_栈区_堆区
- 堆_栈_方法区
- C语言内存分区_栈区、堆区、全局&静态区、文字常量区、程序代码区
- 2014.7.23 内存分析_栈_堆_栈帧
- java内存机制_堆和栈
- java内存机制_堆和栈
- java内存机制_堆和栈
- java内存机制_堆和栈
- java零碎要点001--深入理解JVM_Java的堆内存_栈内存_以及运行时数据区的作用
- java内存管理_堆和栈_内存泄露…
- 初探java内存机制_堆和栈
- 初探java内存机制_堆和栈
- 初探java内存机制_堆和栈
- 初探java内存机制_堆和栈
- 内存分配_栈与堆的区别
- 【JVM】1_测试堆内存溢出异常
- 数据结构_堆排序
- 树_最小堆
- php中\r \r\n \t的区别
- 加载数据
- JAVA内部类使用,什么时候该使用内部类及使用内部类的好处
- 如何用Latex合并两个pdf
- jquery ul li 按照时间排序
- 内存四区_栈区_堆区
- Android TV开发之监听网线,WiFi,蓝牙,U盘的状态
- FJNU 1199 火柴棒(贪心)
- 二级联动选项
- Android 使用socket实现两个真机之间的通信
- ajax分页查询处理
- Servlet实现网页访问次数
- artTemplate-3.0
- avalon $fire解除非监控属性的限制