以下程序正确显示结果
#include <stdio.h>
int main()
{
int address = 0x00018EA0;
int *flashLocat = (int*)address;
printf("%x\n%x\n%x\n",address,flashLocat,&flashLocat);
return 0;
}
输出
18ea0
18ea0
180209e0
以上方案采用以下方式
#include <stdio.h>
int main()
{
int address = 0x00018EA0;
int *flashLocat = (int*)address;
printf("%x\n%x\n%x\n%x\n",address,*flashLocat,flashLocat,&flashLocat);
return 0;
}
崩溃了,为什么会崩溃?如果有人回答,那就太棒了。提前谢谢。
答案 0 :(得分:2)
0x00018EA0
是一个随机地址(据任何人都知道)没有任何意义。它被映射到页面的可能性微乎其微;它被映射到用户空间进程具有权限的页面的可能性更大。
因此,当您取消引用指针 - 访问可能不存在的内存并且您可能无权访问时 - 会出现错误,特别是分段错误
第一个程序不会崩溃,因为它永远不会访问内存 - 它只查看从未访问过的指针的值。
答案 1 :(得分:2)
首先,您不知道地址0x00018EA0
是否有效。
在第一个程序中,您没有访问内存位置0x00018EA0
,而只是访问指针的地址和地址。
printf("%x\n%x\n%x\n",address,flashLocat,&flashLocat);
// address --> is value of pointer, so it is valid
// flashLocat --> is value of pointer, so it is valid
// &flashLocat--> is the address of flashLocat, so it is valid
但是在第二个程序中,实际上是在访问内存位置,如果地址无效,则会给出错误。
printf("%x\n%x\n%x\n%x\n",address,*flashLocat,flashLocat,&flashLocat);
// *flashLocat --> trying to access the location, can be INVALID