取消引用从有效内存地址的整数转换的指针会导致分段错误

问题描述 投票:0回答:1

我正在摆弄 c 指针并编写了这段代码

#include <stdio.h>

int main() {
    int a = 17;
    int* p1 = &a;
    int* p2 = (int*)(&p1);
    p1 = (int*)(&p2);
    printf("%d\n", *((int*)(*p1)));
    printf("%d\n", *((int*)(*p2)));
    return 0;
}

程序退出

[Done] exited with code=3221225477 in 0.23 seconds

指针按预期工作

#include <stdio.h>

int main() {
    int a = 17;
    int* p1 = &a;
    int* p2 = (int*)(&p1);
    p1 = (int*)(&p2);
    printf("&p1 %d\n", &p1);
    printf("&p2 %d\n", &p2);
    printf("p1 %d\n", p1);
    printf("p2 %d\n", p2);
    printf("*p1 %d\n", *p1);
    printf("*p2 %d\n", *p2);
    // printf("%d\n", *((int*)(*p1)));
    // printf("%d\n", *((int*)(*p2)));
    return 0;
}
&p1 748680992
&p2 748680984
p1 748680984
p2 748680992
*p1 748680992
*p2 748680984

当我尝试取消引用任意地址时,它才停止工作

根据另一个问题的答案,取消引用任意内存地址不起作用的原因是地址无效

但在这里我取消引用了一个我之前能够很好取消引用的地址

这是因为某种防止不良代码的保护措施吗?如果是的话我想知道保护机制的具体情况 或者我只是为了实现我想要实现的目标而做错了?

c pointers undefined-behavior dereference
1个回答
0
投票

让我们完成所有 printf 的工作,

  • &p1 和 &p2 只是地址(指针)
  • p1 和 p2 也只是地址
  • *p1,p1 设置为 p2 的地址,因此 *p1 将是 p2
  • *p2,p2 设置为 p1 的地址,因此 *p2 将是 p1

永远不会取消引用任意地址,因此不会出现段错误。

© www.soinside.com 2019 - 2024. All rights reserved.