0

これがどのように起こるかわかりません。これは私のコードの一部です..

   int isGoal(Node *node, int startNode){

       int i;
   .
   .
   }

gdb を使用してこれをデバッグすると、以前に割り当てられたメモリ アドレスに「i」が割り当てられていることがわかりました。

(gdb)print &node->path->next
$26 = (struct intNode **) 0xffbff2f0

(gdb) print &i
$22 = (int *) 0xffbff2f0

node->path->next は、この関数の外で既に定義されています。しかし、ご覧のとおり、それらは同じアドレスを共有しているため、ある時点でiカウンターが変更されたときにポインターが別の場所を指すようになります。

solaris プラットフォームで gcc を使用してコンパイルしました。

4

2 に答える 2

3

のメモリiスタックから取得されます。C では「自動ストレージ」と呼ばれることもあります。

スタックから割り当てられたメモリの内容は、ストレージが返されたことを宣言する関数の後では無効になります。たとえば、isGoal()関数が変数にスタック ストレージを割り当てi、ストレージが返される時点までしか存在しないとしisGoal()ます。

のアドレスがプログラム中に既に存在していると表示される理由i&i、スタック メモリ領域が継続的に再利用されるためです。gdb に表示される前に、スタック変数のアドレスを に保存しましたnode->path->next

割り当て関数が戻った後も有効なメモリを取得するには、malloc()とを使用しfree()て、いわゆる「動的メモリ」または場合によっては「ヒープ」からメモリを取得する必要があります。

于 2010-04-12T19:22:54.610 に答える
0

2 つの可能性:

  • 最適化を使用してコンパイルしましたが、これは gdb を混乱させます (たとえばi、最適化されていない可能性があるため、実際にはアドレスがありません)。
  • node->path正しく割り当てられたメモリを指していません。たとえば、そのポインターは、その後スコープ外になったスタック上のオブジェクトを指すように設定されている可能性があります。
于 2010-04-12T19:21:13.123 に答える