Ho appena iniziato a studiare C e, facendo un esempio sul passaggio del puntatore al puntatore come parametro di una funzione, ho riscontrato un problema.
Questo è il mio codice di esempio:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int* allocateIntArray(int* ptr, int size){
if (ptr != NULL){
for (int i = 0; i < size; i++){
ptr[i] = i;
}
}
return ptr;
}
void increasePointer(int** ptr){
if (ptr != NULL){
*ptr += 1; /* <----------------------------- This is line 16 */
}
}
int main()
{
int* p1 = (int*)malloc(sizeof(int)* 10);
allocateIntArray(p1, 10);
for (int i = 0; i < 10; i++){
printf("%d\n", p1[i]);
}
increasePointer(&p1);
printf("%d\n", *p1);
p1--;
free(p1);
fgets(string, sizeof(string), stdin);
return 0;
}
Il problema si verifica nella riga 16, quando modifico *ptr+=1
in *ptr++
. Il risultato atteso dovrebbe essere l'intero array e il numero 1 ma quando uso *ptr++
il risultato è 0.
C'è qualche differenza tra +=1
e ++
? Ho pensato che entrambi fossero la stessa cosa.
allocateIntArray
è un brutto nome in quanto sembra che tu sia malloc
l'array dalla funzione, ma non lo fai. Suggerisco fillIntArray
invece. 2) Non utilizzi il valore restituito di allocateIntArray
. Ti suggerisco di cambiare il tipo di reso in void
. 3) Non dovrebbe if (ptr != NULL)
in funzione di increasePointer
essere if (*ptr != NULL)
? 4) Il cast non malloc
è necessario. Vedi il commento di Sourav sopra. 5) Questo: for (int i = 0; i < 10; i++){ printf("%d\n", p1[i]); }
e printf("%d\n", *p1); p1--;
deve essere racchiuso in if(p1 != NULL)
. 6) string.h
è inutilizzato.
p+=1
è come ++p
, non comep++
string
.