Struct * p!= C中的地址

时间:2013-03-05 13:32:22

标签: c pointers memory-management struct

我有一个我不明白的错误。

在这段代码中,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的价值而不是它的地址。

2 个答案:

答案 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

因此,&programsp相同,但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中它显示的是相同的值,所以它不是微软的伎俩:

enter image description here