为什么指针p总是指向它自己的内存地址,如下例所示。我无法看到它被初始化的地方,并猜测它将是一个垃圾值。有人可以告诉我为什么它不是垃圾价值。顺便说一句,我在gcc中编译它,-std设置为c99。
#include <stdio.h>
int main() {
int *p; int a = 4;
p = &a;
*p++;
printf("%d %u\n", *p, p);
}
答案 0 :(得分:4)
您的问题(正如其他答案所指出的)是*p++;
。那要说的是取消引用p然后在p中增加地址。
根据您所看到的情况,我们可以假设p
直接在a
内存之后
_________________________________________
|something | a | p | something else |
-----------------------------------------
最终发生的事情是p
指向a
,然后递增以使其指向自身(或更具体地说:p
存储p
所在的地址在)。
答案 1 :(得分:0)
首先,您需要使用%p打印指针值,并且您的代码具有未定义的行为。您将指针移到a
之后的一个位置并取消引用它。
您的代码并未说明您(看起来)想要的内容,以下内容:
#include <stdio.h>
int main() {
int *p; int a = 4;
p = &a;
printf("%d %p %p\n", *p, p, &p);
}
它产生类似的东西:
4 0x7fff5c17da44 0x7fff5c17da48
p
指向a
,然后*p
是a
的值。 p
的值为0x7fff5c17da44
,这是a
的地址,p
(&p
)的地址为0x7fff5c17da48
。