将变量地址分配给指针。取消引用指针会导致分段错误。如何?

Rob*_*sto 1 c variables types pointers memory-address

正如您所看到的,我只是获取一个变量地址并通过其他变量和指针来回获取它。通过 printf 我可以看到地址 1、值 2 和地址 2 都具有相同的值。但是当我尝试取消引用address2(与address1和&value具有相同的值)时,我收到错误。为什么?

#include <stdio.h>
#include <stdint.h>

int main()
{
    uint32_t value = 0;

    uint32_t* address1 = NULL;

    uint32_t* address2 = NULL;

    address1 = &value;

    printf("address1: %x\n", address1);

    uint32_t value2 = (uint32_t)address1;

    printf("value2: %x\n", value2);

    address2 = (uint32_t*)value2;

    printf("address2: %x\n", address2);

    uint32_t value3 = *address2; //fault here

    printf("*value2: %u\n", value3);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Jos*_*ica 6

在 64 位系统上,auint32_t不够大,无法容纳指针。无论如何,如果在其中放入一个,地址的上半部分就会被截断,因此当您随后使用它时,它会指向错误的位置。更改为 auintptr_t即可修复。

另外,正如 Ingo Leonhardt 所评论的那样,%x是 指针的错误格式说明符,因此它们的打印形式也被截断,这就是为什么您认为这些值都是相等的,尽管它们实际上并非如此。