-1

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

在这段代码中,p 的值应该是程序的地址:

static struct ProgramList{
    struct Program *program;
    struct ProgramList *next;
} programs = {NULL, NULL};

struct ProgramList *p = &programs;

......只是它没有。p中的地址是0x0097c130,程序的地址是0x0097c144。

有什么想法该怎么做?

编辑:我在 Microsoft Visual Studio 中工作,我正在使用调试器的监视功能检查地址。我正在检查 p 和 &programs。Edit2:p的地址是0x0040f89c。我知道我正在寻找 p 的值而不是它的地址。

4

2 回答 2

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
于 2013-03-05T13:37:25.537 回答
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 中它也显示相同的值,所以这不是微软的伎俩:

在此处输入图像描述

于 2013-03-05T13:35:52.803 回答