1

あるポインター構造体ポイントから、メモリを割り当てられた別の構造体へのポインターがある場合、関数呼び出しの後に何が起こるでしょうか? この質問をするように導く構造体について以前に質問しました: 関数内の構造体ポインターのスコープ

例えば:

struct example{
//variables and pointers
struct clip *next;
}*Head

そして、関数にデータ型構造体のポインターがあります。

struct example *newNode=malloc(sizeof(struct example));

同じ関数で、最初のノード (ヘッド) を 2 番目のノード (新しいノード) にリンクします。

Head->next=newNode;

関数が終了した後もリンク/ポインティングは保持されますか? それが理にかなっているのかどうかはわかりませんが、リンクリストの最後に新しいノードを追加するときは、最初にリンクリストを調べて、それがどこで終了するかを確認する必要があります (次のポインター = NULL)。

例えば:

void insert_at_end(){
//We have a pointer cp that goes through the linked list, initially cp->next points to `null so we create a newnode right away`
//struct example cp and newnode gets malloc'd here

if(Head != NULL){
cp=Head;
while(cp->next !=NULL){
cp=cp->next;
}
cp->next=newNode;
else{

//We link the head to the newNode `because we don't want to change the head for each new node added.`
head=newNode;
}
}

しかし、リストの最後に newNode を追加するたびに関数を終了するので、関数に再び入り、リンクリストを調べて終了場所を確認するとどうなるでしょうか? cp->next が何を指しているのかをどのように知るのでしょうか?

4

2 に答える 2

1

リストの最後に追加された各newNodeは関数を終了します。関数を再入力し、リンクリストを調べて関数が終了した場所を確認するとどうなりますか?

あなたnewnodeはリストの最後に追加されます。このポインタはリストの一部であり、関数に対してローカルではありません。したがって、関数を再入力しても、以前に追加されたノードはまだそこにあります。

cp-> nextが何を指しているのかをどうやって知るのですか?

場所がリストのどこに保存されているかがわかります。


動的割り当てでは、割り当てられたメモリは、明示的に削除されるまで割り当てられたままになります。したがって、データの存在は、ポインターまたは関数とは無関係です。

于 2013-03-21T06:32:36.823 に答える
0

覚えておくべきことの 1 つは、ポインターは常に参照渡しであり、値渡しではないということです。したがって、ポインタによるメモリ保持を解放しない限り、ポインタはそのまま残ります (これには注意してください)。そのため、関数を再入力するときに、リンク リストに追加したノードをいつでも参照できます。

ただし、プログラムが終了するとき、またはそれらが必要ない場合は、割り当てられたすべてのポインターを解放する必要があります。

于 2013-03-21T06:37:30.700 に答える