Passo il puntatore come parametro alla funzione. All’interno della funzione lo cambio -> è cambiato. Ma dopo l’uscita è la stessa di prima della chiamata di funzione. Il puntatore non è cambiato. Cosa c’è che non va?
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
Nel debug, ho visto che il valore del puntatore è cambiato all’interno della funzione.
Si noti che lpBuffer = malloc(12)
cambia semplicemente il valore della variabile locale lpBuffer
, ma questo non ha alcun effetto sulla variabile il cui valore è stato passato a GetFrom
. Per cambiare il valore del puntatore nella variabile del chiamante, devi passare un puntatore a quel puntatore.
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
BTW: invece di malloc
e un memset to 0
successivo memset to 0
, potresti usare calloc
, che riempie implicitamente la memoria allocata con 0
–
All’interno della funzione lo cambio -> è cambiato.
Non esattamente: il “it” che è cambiato è la copia del puntatore, non il puntatore originale che è stato passato.
Ma dopo l’uscita è la stessa di prima della chiamata di funzione. Il puntatore non è cambiato.
Questo perché hai cambiato una copia, mentre il puntatore ha mantenuto il suo valore originale.
Per quanto riguarda la correzione di questa situazione, hai una opzione in C e due opzioni in C ++: