2 hchchc6016 hchchc6016 于 2016.03.09 15:03 提问

请问c语言中,int a=0;变量名a和数值是怎么在内存分配的
c

我看了很多答案,有些说只分配一个内存存0,a被隐藏了
那么这个隐藏又是怎么个隐藏法呢
还有说a和0同时存着
不懂,求指教

5个回答

qq423399099
qq423399099   Ds   Rxr 2016.03.09 16:23
已采纳

每次我们要使用某变量时都要事先这样声明它,它其实是内存中申请了一个名为i的整型变量宽度的空间(DOS下的16位编程中其宽度为2个字节),和一个名为a的字符型变量宽度的空间(占1个字节)。
图片说明
i在内存起始地址为6上申请了两个字节的空间(我这里假设了int的宽度为16位,不同系统中int的宽度可能是不一样的),并命名为i。a在内存地址为8上申请了一字节的空间,并命名为a。再看下面赋值: i = 30; a = ’t’;
图片说明

ouchao0727
ouchao0727   2016.03.09 16:25

int a = 0;翻译一下就是,你说:您好编译器和系统,我现在需要一块地方叫做a,你们帮我看看有没有什么合适的地方,如果有就在里面放一个0,以后我在合适的时候说a你们就要帮我找到这个地方,把里面的东西取出来给我 系统和编译器说:好的,我们找了一个地方可以存并且已经帮你存下一个0,以后你说a我就会帮你去这个地方找

w1eix1iao
w1eix1iao   2016.03.26 16:07

这个问题需要考虑多个情况,最简单的情况就是定义一个全局变量a。完全理解这个问题需要一点编译原理的知识。
首先,编译器知道有一个int 型的变量a,于是编译器开辟一块与int型对应的内存(今天的机器上int型一般占32bit,4个byte)。其次,
编译器注意到0这个值,这是个字面值常量,编译器为0这个字面值常量开辟一块内存。最后是=号,这是个赋值操作符,编译器将0这个值赋给变量a。
如果你不能理解为什么编译器会为0开辟内存,你可以在你的编译器执行这行代码:
printf("%d\n", 2147483648);
上面代码表示输出2147483648,也就是int型所能表示的最大值(2147483647)加上1.
不幸的是,我们并不能输出2147483648,因为int型变量最多只能存储2147483647。结果就是——溢出了,也就是说当编译器把2147483648放到一块int型内存时发生了溢出。说了这么多,就是想说字面值常量也是需要内存的。


如果不是定义一个全局变量呢?如果是定义在函数里面的一个局部变量,那么当函数执行时,系统会在栈里面为a开辟内存空间,并初始化为0. 当函数返回时(也就是结束时),属于这个函数的栈空间被释放(也就是说a的空间被释放了)。

qq_26367235
qq_26367235   2016.03.09 20:47

变量名就像一段内存地址的别名, 在该地址存了int类型大小的数据

qq_21912927
qq_21912927   2016.03.09 21:50

这个是要分全局变量和局部变量的 不同的分配方式

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!