2017-11-09 6 views
0
static Token *make_token(Token *tmpl) { 
    Token *r = malloc(sizeof(Token)); 
    *r = *tmpl; 
    r->hideset = NULL; 
    File *f = current_file(); 
    r->file = f; 
    r->line = pos.line; 
    r->column = pos.column; 
    r->count = f->ntok++; 
    return r; 
} 

* rにメモリを割り当てます。そして、それを* tmplと同じにします。私は、メモリが割り当てられた場所が上書きされたと仮定します。説明してください。このスニペットでは、メモリ割り当ては役に立ちますか?私はそれが* tmplによって上書きされたと思いますか?

+0

メモリ割り当てのヘルプは* * *ですか? –

+5

それはうまく見えます。 '* r = * tmpl'を使うと、' tmpl 'で指されている構造体*を 'r'で指し示すメモリ*にコピーします。 –

+2

'r = tmpl;'であれば上書きされます –

答えて

0

ポインタを逆参照するための構文(*r)と一致するポインタToken *r = malloc(sizeof(Token));を宣言する構文から混乱が生じます。最初の行は実際には、rと呼ばれるTokenへのポインタを初期化し、Token* rと等しくなり、2番目の行はrが指し示すスペースを逆参照し、それを変更することを意味します。したがって、完全なコードは構造体へのポインタをとり、構造体をmallocで作成した新しいメモリにコピーし、その上で操作を実行します。割り当て後にポインターが変更されても、ポインターのデータのみが変更されます。

tmplNULLの場合、このコードの動作は未定義です。

0

あなたが最初の関数を入力すると、あなたはこのような状況があります。

 +---+  +----------------+ 
tmpl: | | ----> | Token instance | 
     +---+  +----------------+ 

     +---+  +-------------------------+ 
    r: | | ----> | Heap memory from malloc | 
     +---+  +-------------------------+ 

*r = *tmpl;文のコピーTokenインスタンスの内容:malloc呼び出しの後

 +---+  +----------------+ 
tmpl: | | ----> | Token instance | 
     +---+  +----------------+ 

     +---+ 
    r: | | ----> ??? 
     +---+ 

を、あなたがこれを持っていますtmplからヒープメモリで、r

rそれ自体は上書きされません。

関連する問題