错误指针值的来源是什么?

What is the source of a wrong pointer value?

编辑:我知道第二个例子是错误的,我知道如何改正,我想知道错误的值是从哪里来的,当什么都没有时它们指向哪里? a 是如何成为 2686744

的值的

对不起,我不知道我最多应该选择什么答案,所以我给大家投了赞成票。也许以后会选一个。

当我创建一个指针并尝试以错误的方式抓取它时,如下所示:

int b = 5;
int *a;
a = &b;

据我了解,获取指向变量a的值的正确方法是

printf("value of a is: %d\n", *a);
printf("storage location of a is: %p\n", *a);

那么输出将是

value of a is: 5
storage location of a is: 00000005

但是当我这样尝试错误时,输出指向什么?

printf("value of a is: %d\n", a);
printf("storage location of a is: %p\n", a);

我得到输出

value of a is: 2686744
storage location of a is: 0028FF18

这是从哪里来的?是否有为 a 自动创建的存储位置以及它的值从何而来?

我希望你理解我,我的英语不是很好。谢谢

printf("storage location of a is: %p\n", *a);

这是错误的,因为您使用了错误的格式说明符来打印 int

printf("storage location of a is: %p\n", (void *)a);

要获取存储在此位置的值有

printf("value of a is: %d\n", *a);

是打印出存储值的地址或指针持有什么值的正确方法。

Where does this came from? is there an automatic created storage location for a and where came the value from it?

无中生有。你有一个指向某个有效内存位置的指针,你正试图打印出地址以及存储在其中的值,它应该如上所示完成。

* 解引用 指针 a

a = 0x0028FF18     // This is the virtual memory address of the variable b

printf("value of a is: %d\n", a);    // This prints it in decimal
printf("storage location of a is: %p\n", a);  // This prints it in hex

我相信你想要的是:

printf("value of a is: %d\n", *a);
printf("storage location of a is: %p\n", a);
//                                       ^

这是错误的:

printf("storage location of a is: %p\n", *a);

应该是:

printf("storage location of a is: %p\n", a);

a 是内存地址,而 *a 是获取该地址包含的值的间接寻址。

再次出现:

printf("value of a is: %d\n", a);

a 是地址 而不是 值 - 因此它的 UB 使用 %d 格式说明符。

您混淆了格式说明符。

当你在printf中使用%d时,后面传递的参数应该是int。 当您使用 %p 时,您传递给它的参数应该是地址。 这里:

printf("storage location of a is: %p\n", *a);

您指示 %p 但将整数传递给它(a 指向的对象的值)这是错误的和未定义的行为。

这里也一样:

printf("value of a is: %d\n", a);
printf("storage location of a is: %p\n", a);

第一个是错误的。第二个实际上是正确的,但你应该这样使用它:

printf("storage location of a is: %p\n", (void*)a);