Perché il valore del puntatore passato alla funzione non cambia?

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 ++:

  • In C, passa un puntatore a un puntatore. Ciò consentirà alla tua funzione di apportare modifiche al puntatore passato in esso
  • In C ++, puoi anche passare un riferimento a un puntatore. Ciò produrrà lo stesso comportamento senza la necessità di utilizzare esplicitamente l’operatore di dereferenziazione.