谁能告诉我为什么这段代码不起作用?它总是说段错误
int main()
{
int a = 10;
int b = (int)&a;
int *c = (int*)b;
printf("%d", *c);
return 0;
}
当我打印 c
的值时,它是我期望的 a
的地址,但是当我尊重它时,会发生段错误。假设这是一个 32 位编译器。
最佳答案
a
是一个 int 值,取值为 10。
b
是一个 int,并作为一个 int 值获取,a
的地址被转换为一个 int。
c
是一个指向 int 的指针,并将值 b
转换为指向 int 的指针。
b
的值是 a
的地址,但被转换为 int。
所以 c
“应该”指向 a
并且使用 *c
你“应该”得到 10。问题是在你的机器上int
的大小和 a pointer to an int
的大小不相同,在第一次转换中,您截断了 &a
的值以适应 int 的大小并丢失了地址的一些数字。
现在在 b
有一个 int 只包含 a
的地址的一些数字,因此是一个完全不同的地址,所以当你尝试访问内存时地址(使用 *c
)您没有访问 a
,但是在这种情况下,其他地方的一些内存恰好是无效的。
关于c - 在特定情况下取消引用指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56388346/