2017-05-23 14 views
-1

私は関数にパラメータとしてポインタを渡します。機能の中で私はそれを変更する - >それは変更されました。しかし、出力は関数呼び出しの前と同じです。ポインタは変更されていません。どうしましたか?関数に渡されるポインタの値が変更されないのはなぜですか?

void GetFrom(PVOID lpBuffer){ 
lpBuffer = malloc(12); 
memset(lpBuffer, 0, 12); 
printf("%p",pointer); // 0000028D46DECE50 
} 

PVOID pointer = 0x0; 
printf("%p",pointer); // 000000C2628FEFE4 
GetFromMap(pointer); 
printf("%p",pointer); // 000000C2628FEFE4 

デバッグでは、関数内でポインタの値が変更されていることがわかりました。

+1

この回答が役立つかどうかを確認してください。https://stackoverflow.com/a/4426487/6610379 –

答えて

1

lpBuffer = malloc(12)はローカル変数lpBufferの値を変更するだけですが、これは値がGetFromに渡された変数には影響しません。呼び出し元の変数のポインタの値を変更するには、そのポインタへのポインタを渡す必要があります。

void GetFrom(PVOID *lpBuffer){ 
    *lpBuffer = malloc(12); 
    memset(*lpBuffer, 0, 12); 
    printf("%p",*lpBuffer); // !=0x0 
} 

PVOID pointer = 0x0; 
GetFromMap(&pointer); 
printf("%p",pointer); // should be != 0x0 

ところで:>それが変更されました - - 私はそれを変更する関数内

0

代わりmallocとその後のmemset to 0、あなたは暗黙的に0に割り当てられたメモリを埋めcallocを、使用することができます。

ない正確には:「それは」変更されたそのポインタのコピー、いない渡されたオリジナルのポインタです。

しかし、出力は関数呼び出しの前と同じです。ポインタは変更されていません。

これは、ポインタが元の値を保持していた間にコピーを変更したためです。

限り、この状況が行くの固定など、あなたがCでの一つの選択肢とC++での2つのオプションがあります。Cで

  • を、ポインタへのポインタを渡します。これにより、関数が渡されたポインタに変更を加えることができます
  • C++では、ポインタへの参照を渡すこともできます。これは、逆参照演算子を明示的に使用する必要なく同じ動作を生成します。
関連する問題