44问答网
所有问题
c语言中,int a=0;变量名a和数值是怎么在内存分配的
如题所述
举报该问题
推荐答案 2017-09-18
这个是看变量的类型。
1、栈区(stack):又编译器自动分配释放,存放函数的参数值,局部变量的值等,其操作方式类似于数据结构的栈。
2、堆区(heap):一般是由程序员分配释放,若程序员不释放的话,程序结束时可能由OS回收,值得注意的是他与数据结构的堆是两回事,分配方式倒是类似于数据结构的链表。
3、全局区(static):也叫静态数据内存空间,存储全局变量和静态变量,全局变量和静态变量的存储是放一块的,初始化的全局变量和静态变量放一块区域,没有初始化的在相邻的另一块区域,程序结束后由系统释放。
4、文字常量区:常量字符串就是放在这里,程序结束后由系统释放。
5、程序代码区:存放函数体的二进制代码。
堆和栈的区别:
1、由以上综述就可以得知,他们程序的内存分配方式不同。
2、申请和响应不同:
(1)申请方式:
stack由系统自动分配,系统收回;heap需要程序员自己申请,C中用函数malloc分配空间,用free释放,C++用new分配,用delete释放。
(2)申请后系统的响应:
栈:只要栈的剩余空间大于所申请的空间,体统将为程序提供内存,否则将报异常提示栈溢出。
堆:首先应该知道操作系统有一个记录内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请的空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样代码中的delete或free语句就能够正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会将多余的那部分重新放入空闲链表中。
3、申请的大小限制不同:
栈:在windows下,栈是向低地址扩展的数据结构,是一块连续的内存区域,栈顶的地址和栈的最大容量是系统预先规定好的,能从栈获得的空间较小。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域,这是由于系统是由链表在存储空闲内存地址,自然堆就是不连续的内存区域,且链表的遍历也是从低地址向高地址遍历的,堆得大小受限于计算机系统的有效虚拟内存空间,由此空间,堆获得的空间比较灵活,也比较大。
4、申请的效率不同:
栈:栈由系统自动分配,速度快,但是程序员无法控制。
堆:堆是有程序员自己分配,速度较慢,容易产生碎片,不过用起来方便。
5、堆和栈的存储内容不同:
栈:在函数调用时,第一个进栈的是主函数中函数调用后的下一条指令的地址,然后是函数的各个参数,在大多数的C编译器中,参数是从右往左入栈的,当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令。
温馨提示:答案为网友推荐,仅供参考
当前网址:
http://44.wendadaohang.com/zd/DKDYGWV366G6YWZZYG.html
其他回答
第1个回答 2017-09-16
a只是名子,int分配4个字节空间,数值放在这篇空间中。。本回答被提问者采纳
第2个回答 2017-09-16
系统会先划分一片4字节的空间,到定义int a的时候只是划分一个区域里面可能有数值的。因为内存可能没有清除。
第3个回答 推荐于2017-09-18
简单点说,C程序内存布局有BSS段,data数据段与.text代码段
而int a=0属于初始化了全局or局部变量.那么0这个数据应该是保存在.data数据段中.占4个字节.
而a变量这个名字,实际是不占内存的,但程序运行需要找到0这个值,运行时需要一个地址指向data中0的位置,这个地址本身也是占空间的,可以理解为a所占内存吧.
本回答被网友采纳
相似回答
c语言中,
定义一个
int
型
变量a
( int
a=0;
) ,这样
在内存
空间中
是怎么
保存的...
答:
只有一块
内存
空间,值为
0,
程序通过内存地址来找到a,并不会为保存a这个
名字
再单独
分配
一块空间。
关于
c语言中的变量
问题
答:
这里对a赋值,是将a的值存放
在内存中,
而内存中就给了a一些空间,在内存中你要找到a就要靠地址了,就像门牌号一样,就像你人就是a,你只是住在这个房子里,门牌号就是你的地址。地址是不能赋值的 ,只能
分配
(内存固定有的),而“&”这个运算符是取址运算符,就相当于取得你的门牌号,知道你住...
关于
C语言变量
和数组的声明问题
答:
int
a = 0;
//全局区 void main(){ int b; //栈 char s[] = abc; //s在栈,abc在文字常量区 char *p1,*p2; //栈 char *p3 = 123456; //123456在常量区,p3在栈上 static
int c
=0; //全局区 p1 = (char *)malloc(10); //p1在栈
,分配的
10字节在堆 p2 = (char *)...
在
c语言中,变量名
地址 存储单元的内容 分别怎样储存?
答:
最后,对于
C语言中的
变量来说,它具备两个基本的属性,一个是地址,一个是内容。正是因为此,所以在函数参数传递时有两种方法一种是传址,一种是传值 。比如下面的代码:
int
a =
2; //
a是变量名,
它有两个属性,一个是地址,一个是值。int *p = &a; //使用取地址运算符&即可获取变量的...
大家正在搜
若数组a和变量k均为int
设变量定义为int a b
若a和b均为int型变量
将int型变量n转换成float
设有变量定义int a
若变量a为int类型
若a为int型变量
设a为int型变量
定义a为int型变量
相关问题
c语言中,定义一个int型变量a( int a=0;) ,这...
c语言数组在内存中是怎么分配的?
C语言中 int a,b; a=0; b=a; a和b指向了...
关于c语言中的变量问题
c语言中,int a=0;变量名a和数值是怎么在内存分配的
C语言 int &a 是什么意思
C语言变量的名称是怎么存在的,在内存中么
C语言中使用全局变量 int **a,能否在一个void类型...