#include<stdio.h>
int main()
{
int a = 10;
int* p = &a;
int** q = &p;
printf("\n%d %d %d", a, *p, **q);
int y = (int*)2000;
printf("%d", y);
/*
printf("\n%d %d %d %d", a, *p, **q, *((int*)2000)); //Error line.
*/
return 0;
}
该代码编译并运行。但是,如果取消注释代码,代码仍然会编译,但会在打印最后一个 printf
的结果之前终止。命令。
我的两个问题是:
- 如果
*((int*)2000)
是一个完全有效的代码,例如(int*)2000
(即,将整数转换为地址/指针以获取该地址处的值),为什么程序在结束之前停止 if*((int*)2000)
在场吗? - 为什么此代码不打印
a
的值,*p
,和**q
在终止程序之前(它们在尝试打印*((int*)2000))
之前被打印)?
最佳答案
*((int*)2000)
不是“完全有效的代码”。将整数转换为指针的结果是实现定义的。在您的实现中,(int*)2000
可能会导致无效的指针。尝试取消引用无效指针会产生未定义的行为,这意味着任何事情都可能发生。当您在取消注释的printf
行的情况下运行程序时,它恰好导致了分段冲突,因为生成的指针指向无法访问的内存。如果您使用了其他整数,它可能会产生有效的指针,然后您会看到该内存位置的内容。在调用函数之前,必须评估函数调用的所有参数。上述错误是在计算
printf()
的参数时发生的,因此程序在调用函数之前停止。结果,没有打印任何内容。
关于c - 这段代码有什么问题,它打印将整数转换为整数指针后获得的地址处的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51993122/