-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 でも同じ値が表示されているように見えるので、Microsoft のトリックではありません。

ここに画像の説明を入力

于 2013-03-05T13:35:52.803 に答える