0

next同じ型の構造体へのポインターを保持する構造体があります。

nodeポインターが格納する構造体の番号を格納し、それを解放し、ノードを に設定する次のコードがありますnode->next。その直前に呼び出されたnode->next場合、それが何であるかをどのように知ることができますか?free

double data = node->element;
free(node)
node = node->next;
return data;

ただし、同じロジックに従うと、次のコードは segfault になります。唯一の違いは、これは anodeを使用し、もう一方は要素をその基本データ型で格納するだけであることです。

struct node *temp;
temp = node;
free(node);
node = node->next;
return temp;

なぜこうなった?ところで、コードの最初のセグメントはどのように機能するのでしょうか?

ありがとう

4

1 に答える 1

2

解放されたポインタを逆参照するべきではありません-それはトラブルを求めており、セグメンテーション違反の原因である可能性があります。セグメンテーション違反が発生しなくても、そのメモリ アドレスのデータの有効性を推測することはできないため、これを行うのは適切ではありません。質問にはあまり詳細を記載していませんが、代わりにこの順序を試すためにコードを少し変更してみませんか

struct node *temp = node->next;
free(node);
return temp;

このようにして、削除する前にポインターを保存しnode、segfault を取得しないようにする必要があります

最初のコードについて

double data = node->element;
free(node)
node = node->next;
return data;

なぜ単に置き換えないのですか

double data = node->element;
free(node)
return data;

これにより、解放されたメモリにアクセスするコードが削除され、行が削除されます

node = node->next;

nodeとにかく 次の行で解放すると、実質的に無意味になります。

于 2012-07-08T10:47:22.757 に答える