我正在摆弄 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
当我尝试取消引用任意地址时,它才停止工作
根据另一个问题的答案,取消引用任意内存地址不起作用的原因是地址无效
但在这里我取消引用了一个我之前能够很好取消引用的地址
这是因为某种防止不良代码的保护措施吗?如果是的话我想知道保护机制的具体情况 或者我只是为了实现我想要实现的目标而做错了?
让我们完成所有 printf 的工作,
永远不会取消引用任意地址,因此不会出现段错误。