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),抛弃了传统的内存分配方式,改为自主管理. ...
随机推荐
- spring和mybatis整合配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- LeetCode 1 Two Sum(二分法)
题目来源:https://leetcode.com/problems/two-sum/ Given an array of integers, find two numbers such that t ...
- 关于手机微网站ICP备案
今天终于拨通了陕西省通信管理局的电话,并告诉对方我们做的是一个化妆品的微网站,会涉及到使用使用支付宝支付. 询问"xxx微网站"网站经营类型,对方告知虽然使用支付宝,但是是微网站, ...
- PHP读写XML文件的四种方法
PHP对XML文件进行读写操作的方法一共有四种,分别是:字符串方式直接读写.DOMDocument读写. XMLWrite写和XMLReader读.SimpleXML读写,本文将依次对这四种方法进行介 ...
- 使用culr
使用curl在采集有语言要求的网站时,首先需要发送带有语言设置的请求,再发送你要的请求如: 注:vget(); 这里没提供: $url='http://www.hotels.com/?locale=e ...
- Showing progress bar in a status bar pane
在工具卡显示进度条,原文链接:http://www.codeproject.com/Articles/35/Showing-progress-bar-in-a-status-bar-pane 1.构造 ...
- runv kill 流程分析
1.runv/kill.go Action: func(context *cli.Context) 该函数做的工作很简单,就是通过grpc客户端,发送一个grpc请求而已,如下: c.Signal(n ...
- 离散化+线段树 POJ 3277 City Horizon
POJ 3277 City Horizon Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 18466 Accepted: 507 ...
- 2016.6.12 codevs搜索练习
1.codevs 3143 二叉树的序遍历 /*只要把输出根节点的位置调换一下就可以了*/ #include<iostream> using namespace std; #include ...
- 微博API使用
新浪微博的API开放平台: http://open.weibo.com/wiki/%E5%BE%AE%E5%8D%9AAPI IOS和Android都有SDK可以下载,ios的地址: https:// ...