我有一个我不明白的错误。
在这段代码中,p的值应该是程序中的地址:
static struct ProgramList{
struct Program *program;
struct ProgramList *next;
} programs = {NULL, NULL};
struct ProgramList *p = &programs;
......只是它没有。 p中的地址是0x0097c130,程序的地址是0x0097c144。
任何想法该怎么做?
编辑:我在Microsoft Visual Studio中工作我正在使用调试器的监视功能检查地址。我正在检查p和&程序。 Edit2:p的地址是0x0040f89c。我知道我正在寻找p的价值而不是它的地址。
答案 0 :(得分:4)
此:
int main(int argc, char **argv) {
struct P *p = &programs;
printf("%p %p %p\n", &programs, p, &p);
}
有这个结果:
bf @ bf-laptop:〜/ playground $ ./testprogram
0x804a01c 0x804a01c 0xbfe32a4c
因此,&programs
和p
相同,但p
的地址不同。
基本上,&programs
是结构programs
所在的地址。 p
是存储programs
地址的位置。 &p
是存储该地址的地址。
原理图:
[address] [name] [value]
0x804a01c programs <programs struct>
0xbfe32a4c p 0x804a01c
答案 1 :(得分:2)
检查地址的方法不正确,请尝试以下方法:
struct ProgramList *p = &programs;
printf("%p %p\n", p, &programs);
你应该看到它们是一样的。我怀疑你做的事情是:
printf("%p %p\n", &p, &programs);
指针的地址(不是它的值)。
编辑
根据您的评论,您可以通过printf
查看,只要条件正确:
if(p == &programs)
printf("I failed"); // will print "I failed" because the values are the same.
既然你说你正在使用VS调试器我把它掸掉并将代码卡在那里,看起来甚至在VS 2010中它显示的是相同的值,所以它不是微软的伎俩: