创建指向给定地址的指针时出现问题

A F*_*A F 0 c pointers memory-management segmentation-fault

我正在尝试创建一个指向用户给定的内存地址的指针,但我遇到了问题。我实际上设法创建指针并打印其地址,但我从未成功打印或更改其内容。有没有好心人解释一下为什么?

这是我试图运行的代码:

    int m = 10;
    printf("&m = %d (address in dec.)\n", &m);

    printf("Enter an address: ");
    int address;
    scanf("%d", &address);
    int* p = (int*) address;

    printf("p = %d (address in dec.)\n", p);
    printf("*p = %d (value)\n", *p);

Run Code Online (Sandbox Code Playgroud)

这是我与程序交互的控制台:

&m = 1220033252 (address in dec.)
Enter an address: 1220033252
p = 1220033252 (address in dec.)
Segmentation fault
Run Code Online (Sandbox Code Playgroud)

如果我尝试使用与 &m 不同的地址,也会发生同样的事情。

谢谢!

Bar*_*mar 5

int不一定大到足以容纳一个指针。它通常是 32 位,但现在许多系统上的指针是 64 或 128 位。

您可以使用内置的 typedefintptr_t来声明一个足够大的整数以保存指向整数的指针。

int m = 10;
printf("&m = %" PRIiPTR " (address in dec.)\n", (intptr_t)&m);

printf("Enter an address: ");
intptr_t address;
scanf("%" SCNiPTR, &address);
int* p = (int*) address;

printf("p = %" PRIiPTR " (address in dec.)\n", (intptr_t)p);
printf("*p = %d (value)\n", *p);
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅为什么/何时在 C 中使用 `intptr_t` 进行类型转换?对于intptr_t和uintptr_t的字符串格式