为什么要取消引用指针并打印值使程序崩溃

时间:2018-06-06 16:51:53

标签: c pointers

以下程序正确显示结果

#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;
}

崩溃了,为什么会崩溃?如果有人回答,那就太棒了。提前谢谢。

2 个答案:

答案 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