c - 在特定情况下取消引用指针

标签 c

谁能告诉我为什么这段代码不起作用?它总是说段错误

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/

相关文章:

python - 如何在 Python 中调试 C 编译器错误? (malloc 错误)

c - 获取用户输入时出现段错误?

c - 初始化一个结构对象数组,这些对象之前存储在结构变量中

c - 奇怪的 C 行为 : variable visible when it shouldn't be

c - 执行不工作

c - 在编译时检测段错误

c++ - 如何包含名称中包含 `>` 的头文件?

在动态加载之前检查共享库的兼容性

c++ - 信号如何与序列点相互作用?

c - 双向链表