C++程序中变量的存储有关问题
C++程序中变量的存储问题
我的main函数中有如下代码:
int iA[2] = {1,2};
char iM = 5;
bool iN = 5;
float iZ = 5;
printf("%p\n",iA);
printf("%p\n",&iA[1]);
printf("%p\n",&iM);
printf("%p\n",&iN);
printf("%p\n",&iZ);
由于是局部变量,根据自己的分析:局部变量是栈变量,调用main函数时都会给这些栈变量开辟内存。机器显示是小端存储,所以我以为内存地址输出应该是: iZ<iN<iM<iA<iA[1],可是实际的输出结果却是:
001EFCA4
001EFCA8
001EFCA2
001EFCA3
001EFCAC
iA和iA[1]没问题 ,为什么iN的地址却大于了iM,并且iZ的地址比iA还大?难道是他们在入栈之前编译器给了优化而没有按照我自己写的语句顺序压栈吗?
我又将局部变量提升成了全局变量后,内存地址就是从小到大的,就是不明白为啥局部的会是乱的。C++初学者,分不多,还望各位大神答疑解惑,感激不尽
------解决方案--------------------
楼主理解错小端的意义了吧?
举个例子,int 型,它的高位存在高字节,低位存在低字节,这才是小端。这是一个int内部的情况。
你两个临时变量int A,int B.它们的位置是由编译器决定的,A和B可能紧紧地放在一起,这种情况一般上也是B的地址比A的地址高。
g++和vs的结果基乎是不会一样的。
这样的内存排序和大小端这个概念没有半毛钱关系!!!
------解决方案--------------------
不要企图依赖输出指针相关表达式的值【比如printf("%p\n",...)】来理解指针的本质,
而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=...】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。
------解决方案--------------------
编译器自己安排顺序 反正 你是通过变量名读写那块内存 那块内存是在a 前面还是后面 不应该对你的逻辑产生影响
我的main函数中有如下代码:
int iA[2] = {1,2};
char iM = 5;
bool iN = 5;
float iZ = 5;
printf("%p\n",iA);
printf("%p\n",&iA[1]);
printf("%p\n",&iM);
printf("%p\n",&iN);
printf("%p\n",&iZ);
由于是局部变量,根据自己的分析:局部变量是栈变量,调用main函数时都会给这些栈变量开辟内存。机器显示是小端存储,所以我以为内存地址输出应该是: iZ<iN<iM<iA<iA[1],可是实际的输出结果却是:
001EFCA4
001EFCA8
001EFCA2
001EFCA3
001EFCAC
iA和iA[1]没问题 ,为什么iN的地址却大于了iM,并且iZ的地址比iA还大?难道是他们在入栈之前编译器给了优化而没有按照我自己写的语句顺序压栈吗?
我又将局部变量提升成了全局变量后,内存地址就是从小到大的,就是不明白为啥局部的会是乱的。C++初学者,分不多,还望各位大神答疑解惑,感激不尽
------解决方案--------------------
楼主理解错小端的意义了吧?
举个例子,int 型,它的高位存在高字节,低位存在低字节,这才是小端。这是一个int内部的情况。
你两个临时变量int A,int B.它们的位置是由编译器决定的,A和B可能紧紧地放在一起,这种情况一般上也是B的地址比A的地址高。
g++和vs的结果基乎是不会一样的。
这样的内存排序和大小端这个概念没有半毛钱关系!!!
------解决方案--------------------
不要企图依赖输出指针相关表达式的值【比如printf("%p\n",...)】来理解指针的本质,
而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=...】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。
------解决方案--------------------
编译器自己安排顺序 反正 你是通过变量名读写那块内存 那块内存是在a 前面还是后面 不应该对你的逻辑产生影响