错误指针值的来源是什么?
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);
编辑:我知道第二个例子是错误的,我知道如何改正,我想知道错误的值是从哪里来的,当什么都没有时它们指向哪里? 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);