c++ - C中的结构内存布局

标签 c++ memory pointers struct

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。由于 numstruct 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/

相关文章:

c++ - 动态分配内存以存储使用 WinHttpReadData 下载的 HTML 源

c++ - dynamic_cast的实际使用?

c++ - Visual Studio 2012 : 'opencv2/opencv.hpp' : No such file or directory (C1083)

Python内存问题

c - 在 C 中传递二维字符数组

c++ - 如何从 const float* 中获取 C++ vector

c++ - 编程语言函数在内存中位于哪里?

c - 在初始化期间为指针分配字符串值时到底发生了什么?

C 访问冲突错误

c - 结构体指针数组 [C++]