我看了很多答案,有些说只分配一个内存存0,a被隐藏了
那么这个隐藏又是怎么个隐藏法呢
还有说a和0同时存着
不懂,求指教
每次我们要使用某变量时都要事先这样声明它,它其实是内存中申请了一个名为i的整型变量宽度的空间(DOS下的16位编程中其宽度为2个字节),和一个名为a的字符型变量宽度的空间(占1个字节)。
i在内存起始地址为6上申请了两个字节的空间(我这里假设了int的宽度为16位,不同系统中int的宽度可能是不一样的),并命名为i。a在内存地址为8上申请了一字节的空间,并命名为a。再看下面赋值: i = 30; a = ’t’;
int a = 0;翻译一下就是,你说:您好编译器和系统,我现在需要一块地方叫做a,你们帮我看看有没有什么合适的地方,如果有就在里面放一个0,以后我在合适的时候说a你们就要帮我找到这个地方,把里面的东西取出来给我 系统和编译器说:好的,我们找了一个地方可以存并且已经帮你存下一个0,以后你说a我就会帮你去这个地方找
变量名就像一段内存地址的别名, 在该地址存了int类型大小的数据
这个是要分全局变量和局部变量的 不同的分配方式
这个问题需要考虑多个情况,最简单的情况就是定义一个全局变量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的空间被释放了)。
这个问题需要你理解一下编译底层是怎么做的,我回答这个问题,也相当于在回答自己,巩固一下知识。int a=0;首先是int a再是a=0:编译器,我要申请一个存储int类型的空间(实际上就是malloc一块空间,sizeof(int)大小的,专门用来存int类型的),然后请将0这个值存储这块空间。大体上就是这样,如有错误,请各路大神指点一二,洗耳恭听!