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
这是从哪里来的?是否有一个自动创建的存储位置,以及来自它的价值?
我希望你理解我,我的英语不是很好。谢谢
答案 0 :(得分:2)
您的格式说明符令人困惑。
在%d
中使用printf
时,稍后传递的参数应为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);
答案 1 :(得分:1)
*
解除引用指针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);
// ^
答案 2 :(得分:1)
这是错误的:
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
格式说明符。
答案 3 :(得分:0)
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);
是打印输出值的地址或指针所持有的值的正确方法。
这是从哪里来的?是否有自动创建的存储空间 a的位置和来自它的价值来源?
没有任何东西来自任何地方。你有一个指针,指向一些有效的内存位置,你试图打印出地址以及存储在其中的值,它应该如上所示完成。