我有这个:
unsigned int y = (unsigned int)(int*)foo;
如何获取存储在foo
点的内存值中的地址?
让我们试着更好地解释,假设thery是int类型:
int x = 10;
int *foo = &x;
unsigned int y = (unsigned int)(int*)foo;
int r = MAGIC(y); /* should be 10 */
x = 13; /* r still should be 10 */
y
应该保存x的地址,它是10
整数的地址。
r
应复制 y
位置的值,10
整数。
因此,x
(如x = 13
)中的任何更改都不应更改值r
。这只是一个int。
问题是:如何定义MAGIC
?
答案 0 :(得分:3)
如果您想要的是什么,那么
#define MAGIC(y) (*((int*)(y)))
会这样做。
答案 1 :(得分:1)
您的代码尝试使用y
作为指针,实际上它是作为unsigned integer
定义给C编译器的。在“糟糕的日子”中写回的代码会像你的例子那样做。
代码应该在其意图中更加明确和明确,因此:
#include <stdlib.h>
main()
{
int x = 10;
int *foo = &x;
int *y = foo;
#define MAGIC(A) *A
int r = MAGIC(y); /* should be 10 */
x = 13; /* r still should be 10 */
printf("x=%d, r=%d", x, r);
// printed (as expected) :: x=13, r=10
}
这些天没有理由解决C编译器的问题!!
如果您要维护一些像原始示例那样的旧代码,那么使用今天的编程风格重新编写代码可能是值得的。注意,它可以保持用C语言编写,只是格式良好的C!
答案 2 :(得分:0)
如果y要保存x的地址,则应将其声明为:
unsigned int *y;
MAGIC应该只是 运算符指向的内容。
int r = *y;
MAGIC只是星号。