C语言 内存四大存储区域
#include<stdio.h>
#include<stdlib.h> //程序代码指令,define定义的常量---代码区(只读)
//全局(关键)变量/常量,静态(关键)变量/常量,常量字符串---静态区
//静态区的内容在总个程序的生命周期内都存在,由编译器在编译的时候分配。
//局部变量---栈区
//栈区上的内容只在函数的范围内存在,当函数运行结束,这些内容也会自动被销毁。其特点是效率高,但空间大小有限。
//由malloc或者realoc,calloc分配的内存区域---堆区
//堆区其生命周期由free决定。 #define PI 3.14 // //全局变量
int a = ;
int b[] = { , , , , };
int const c = ; void run2(); void main(){
int num = ;
//对于int num = 10;的理解
//int 数据类型 编译器预算对象(变量)num分配4个字节内存空间大小
//num是内存中一段内存空间的标识(相当于门牌号),
//10 才是存储在这段内存空间里的数据
//详细的来说,“int num=10;”这段字符存储在代码区,数据10存储在栈区 //验证局部常量是否存储在栈区
run2();
//经过内存观察,开始局部常量cde的内存空间的数据是2
//当run2()函数执行完毕,局部常量cde的内存空间的数据发生变化
//因为静态区的内容在总个程序的生命周期内都存在,所以判断局部常量存储在栈区 char *p = "asdfadsf";//"asdfadsf"是字符串常量,在静态区,只读
//指针p是临时变量,在栈区
//验证 "asdfadsf" 只读
//*p = 'a';//编译不报错
printf("%s\n", p);//运行报错--“写入位置 0x001B692C 时发生访问冲突。”,由此证明"asdfadsf"是字符串常量,只读 //堆只能是malloc或者realoc,calloc,分配的内存才是堆
//例如以下代码
void *p1 = malloc(sizeof(int)* );//malloc(sizeof(int)* 1024);分配的内存就是堆区,但是指针p1是在栈区
//堆的使用情况:①无法确定需要内存的大小;②需要的内存很大
//堆的注意点:堆和栈不同,堆的内存大小是由程序员分配的,必须由程序员手动释放(free(p1););
//对于栈来说,栈的内存大小由系统分配(栈的极限大约是1M,非常小),所以栈的内存空间是由系统回收的 //堆的内存大小是由程序员分配的,理论上可以占据系统中所有的内存(甚至能抢占栈的内存空间)
//因为栈的内存空间是由系统回收的,所有在回收的时候会消耗大量的cpu
char d = 'a';//变量d的数据在栈区中 system("pause");
} //run1是程序代码,所以存储在代码区
void run1(){
while (){
int x = ;//x变量的内存空间在栈区,因为while循环,x每次循环都会初始化,所以系统不断的在栈上创建x的内存空间,回收x的内存空间,会消耗大量的cpu
printf("%d", x);
}
} void run2(){
const cde = ;//变量cde的数据在栈区,与cde是否是常量没关系
printf("%x\n",&cde);//获取cde的地址,检测run2()函数在main()执行完成之后,系统是否会回收cde指向的内存空间
} int add(int a, int b){//形参a,b是临时变量,形参a,b的数据存储在栈区
return a + b;//a+b的操作会在寄存器中执行
}
C语言 内存四大存储区域的更多相关文章
- C语言5种存储区域
C语言5种存储区域 转发至:http://www.mamicode.com/info-detail-927635.html 系统为了管理内存 把内存划分了几个区域 1> 栈区 栈区之中的数据在栈 ...
- c语言 变量的存储类别以及对应的内存分配?
<h4><strong>1.变量的存储类别</strong></h4>从变量值存在的角度来分,可以分为静态存储方式和动态存储方式.所谓静态存储方式指在程 ...
- C/C++程序内存的各种变量存储区域和各个区域详解
转自 https://blog.csdn.net/jirryzhang/article/details/79518408 C语言在内存中一共分为如下几个区域,分别是: 1. 内存栈区: 存放局部变量名 ...
- C语言内存管理(转)
伟大的Bill Gates 曾经失言: 640K ought to be enough for everybody — Bill Gates 1981 程序员们经常编写内存管理程序,往往提心吊胆.如果 ...
- iOS学习08之C语言内存管理
本次主要学习和理解C语言中的内存管理 1.存储区划分 按照地址从高到低的顺序:栈区,堆区,静态区,常量区,代码区 1> 栈区:局部变量的存储区域 局部变量基本都在函数.循环.分支中定义 栈区的内 ...
- C语言——内存分配
1.在C语言的运行过程中,需要内存来存储数据.C语言使用的内存总体可以分为两类:一类是静态区,一类是动态区.2.静态数据存储区包含:只读数据区.已初始化的读写数据区.未初始化的读写数据区 动态 ...
- C语言内存地址基础
来源:http://blog.jobbole.com/44845/ 从计算机内存的角度思考C语言中的一切东东,是挺有帮助的.我们可以把计算机内存想象成一个字节数组,内存中每一个地址表示 1 字节.比方 ...
- 局部变量存储区域静态变量存储区域static变量存储区域
局部变量存储区域静态变量存储区域static变量存储区域 常见的存储区域可分为: 1.栈 由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区.里面的变量通常是局部变量.函数参数等. 2.堆 ...
- 图解Go语言内存分配
目录 基础概念 内存管理单元 内存管理组件 mcache mcentral mheap 内存分配流程 总结 参考资料 Go语言内置运行时(就是runtime),抛弃了传统的内存分配方式,改为自主管理. ...
随机推荐
- 解析XML的几种方法之SAX解析
假期总结不能停,坚持坚持....接下来总结一下XMl和json的解析和生成.. 解析XML的四种方法,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址: DOM:在现 ...
- Google可能会用苹果的Swift 为什么?
Google可能会用苹果的Swift 为什么? 2014 年夏天,苹果在 WWDC 大会上宣布了全新的程序语言 Swift,主要用来开发 iOS 与 OSX 应用. 去年年底,苹果将 Swift 开源 ...
- Class org.apache.struts2.json.JSONWriter can not access a member of class org.springframework.aop.TruePointcut with modifiers "public"
Spring注入Action使用Json错误:org.apache.struts2.json.JSONException: org.apache.struts2.json.JSONException: ...
- 怎么向Xcode6 IOS8之后向项目中添加预编译文件
苹果的XCode在6版本之后新建项目时取消了自动创建预编译头文件pch,该文件里存放的工程中一些不常被修改的代码,比如常用的框架头文件,这样做的目的提高编译器编译速度.我们可以往里面加入一些项目中都要 ...
- fatal error: file '/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Dev
类似这样的错误: fatal error: file '/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.pla ...
- GCD中的dispatch_set_target_queue的用法及作用
(一),使用dispatch_set_target_queue更改Dispatch Queue的执行优先级 dispatch_queue_create函数生成的DisPatch Queue不管是Ser ...
- Swift语言
本文为熟悉使用Objective-C开发iOS快速转入swift开发提供一些便利的途径,没有过多华丽的说明底层原理,也没有过多的概念说明,只提供swift的基本使用以及一些使用示例.高手请让路哈. S ...
- WPF Caliburn.Micro ListView 批量删除,有其他方法的大家一起交流一下
做这种批量删除的时候我的想法是获取每行的ID,然后更具ID删除,看过一些博客,大部分都是直接写在.CS文件里面,将ListView和CheckBox关联起来,最后用checkbox ck=sender ...
- HTML列表元素
HTML定义了3类列表: 1.有序列表(通常用数字编号) 2.无序列表(通常前面加原点) 3.自定义列表(列表项目,带有集成的定义) 有序列表和无序列表均为列表中的每一项使用列表项元素(<li& ...
- 解决log4j:WARN Error initializing output writer. log4j:WARN Unsupported encoding?的问题
异常名:log4j:WARN Error initializing output writer. log4j:WARN Unsupported encoding? 异常截图: 在一般的javaweb项 ...