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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C语言中内存分配
在任何程序设计环境及语言中,内存管理都十分重要。在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的。因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题。 第1节主要介绍内存管理基本概念,重点介绍C程序中内存的分配,以及C语言编译后的可执行程序的存储结构和运行结构,同时还介绍了堆空间和栈空间的用途及区别。 第2节主要介绍C语言中内存分配及释放函数、函数的功能,以及如何调用这些函数申请
C语言中int与long int的区别
区别是它们的有效范围不一样。 在turbo C中,系统为整型(int)数据分配两个字节,表示范围在-32768到32767之间。如果不在这个范围内就要使用长整型(long int)来表示了。 在Visual C++中,系统为整型(int)数据分配四个字节,表示的范围在-2147483648到2147483647之间,因此在Visual C++中没有必要使用长整型,但便于规范和好记还是建议在需要
c语言中unsigned int和int的区别
void foo(void)  {    unsigned int a = 6;    int b = -20;    (a+b > 6) ? puts("> 6") : puts(" }     这个问题测试你是否懂得C语言中的整数自动转换原则,我发现有些开发者懂得极少这些东西。不管如何,这无符号整型问题的答案是输出是 ">6"。原因是当表达式中存在有符号类型和无符号类型时所有
C语言中变量名的命名规则
一、简介 1、严格采用阶梯层次组织程序代码: 各层次缩进的分格采用VC的缺省风格,即每层次缩进为4格,括号位于下一行。要求相匹配的大括号在同一列,对继行则要求再缩进4格。例如: 2、提示信息字符串的位置 在程序中需要给出的提示字符串,为了支持多种语言的开发,除了一些给调试用的临时信息外,其他所有的提示信息必须定义在资源中。 3、对变量的定义,尽量位于函数的开始位置。
C语言中,"int* a, b, c;" 是正确写法吗?
有以下的C语言代码int* a, b, c; int *a, *b, *c; int *a, b, c;其中哪些语句是等价的? 哪些语句又是指针的正确写法?对于这些问题,相信一开始学习指针的同学都有些迷惑,现在来剖析一下它们吧 很多人喜欢用第一种写法定义指针 int*, char*…理解为int型指针、char型指针这样理解不错,但是写法却是不规范的 int * a, b, c; 的实际含义
c语言中int *p[4]和 int (*)p[4]区别
1,由于[] 优先级高与*所以int *p[4]它先p[4]是定义数组的形式然后和*结合,*p[4]就是数组指针(一个数组中存放的内容是指针变量) 2,int a[4];(a中有4个元素,每个元素为整型)===》a(*p)    int (*p)[4];((*p)有4个元素,每个元素为整型) 也就是说p所指的对象是有4个整型元素的数组,
C语言中数值类型转换
数值类型转换
C语言拾遗:(int)a、&a、(int)&a、(int&)a的区别
(int)a、&a、(int)&a、(int&)a的区别,很偏僻的题  #include  #include #include #include using namespace std; int main() { float a = 1.0f; cout << sizeof(int) <<endl;//4 cout << sizeof(float) <<endl;//4 cout <<
static int 与 int 的区别
我在网上找了很多相关资料,但是因为不是计算机专业的,对“类”的
C语言中int main与void main的区别
<br />正确而且标准的方式应该是int main()或者int main(int argc, char* argv[])<br /> <br />原因是:main函数的返回值是用来表示程序的退出状态的,return 0表示无错误,其他的返回值根据系统不同可能代表不同的类型,如果不返回可能会无法检测到错误。<br /> <br />另外一个原因是:如果返回值是返回到栈上的,则程序未返回值的情况下,程序的调用者会从栈上误pop一个值认为是程序的返回值,这样的话就会造成下面的操作错误,因为多pop了一个值。<