struct fraction {
int num;
int denum;
} pi;
pi.num=22;
pi.denum=7;
((fraction*)&(pi.denum))->num=12;
cout << endl;
cout << pi.denum <<endl;
cout << pi.num <<endl;
我能看懂内存图到这里 我感到困惑的是以下代码
((fraction*)&pi.denum)->denum=33;
是否有合法的方式打印出 33? 任何命令来获取不在对象 View 中的存储值?
最佳答案
struct fraction
将作为两个连续的 int
在内存中布局。您的代码查看表达式 &pi.denum
,它是第二个整数的地址:
-----------------------
| int num | int denum |
-----------------------
^ ^
| |
&pi &(pi.denum)
但是您将 &pi.denum
转换为 fraction *
并尝试访问 ((fraction*)&(pi.denum))->num
。由于 num
是 struct fraction
的第一个成员,C 标准保证其地址与结构本身相同。所以
&(((fraction*)&(pi.denum))->num) == (fraction*)&(pi.denum) == &pi.denum.
它是一个有效的内存位置——但只能靠运气。如果您尝试访问 ((fraction*)&(pi.denum))->denom
,您会遇到未定义的行为 - 可能会损坏内存或导致段错误。
最重要的是,((fraction*)&(pi.denum))->num = 12
是无意义的代码。它永远无法做任何有用的事情。
关于c++ - C中的结构内存布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8882420/