S'appuyant sur ce que j'ai appris ici: Manipulation d'un tableau dynamique via des fonctions en C .
void test(int data[])
{
data[0] = 1;
}
int main(void)
{
int *data = malloc(4 * sizeof *data);
test(data);
return 0;
}
Cela fonctionne bien. Cependant, j'essaie également d'utiliser realloc
dans une fonction.
void increase(int data[])
{
data = realloc(data, 5 * sizeof *data);
}
Cela est conforme, mais le programme se bloque lors de l'exécution.
Question
Comment dois-je utiliser realloc dans une fonction?
Je comprends que je devrais affecter le résultat de realloc
à une variable et vérifier s'il s'agit de NULL
en premier. Ceci est juste un exemple simplifié.
Vous souhaitez modifier la valeur d'un int*
(votre tableau), vous devez donc lui passer un pointeur dans votre fonction increase
:
void increase(int** data)
{
*data = realloc(*data, 5 * sizeof int);
}
Le code d'appel ressemblerait alors à:
int *data = malloc(4 * sizeof *data);
/* do stuff with data */
increase(&data);
/* more stuff */
free(data);
Gardez à l'esprit la différence entre un pointeur et un tableau.
Un tableau est un mandrin de mémoire dans la pile, et c'est tout. Si vous avez un tableau:
int arr[100];
Alors arr est une adresse de mémoire, mais aussi & arr est une adresse de mémoire, et cette adresse de mémoire est constante, non stockée dans aucun emplacement. Vous ne pouvez donc pas dire arr = NULL, car arr n'est pas une variable qui pointe vers quelque chose. C'est juste une adresse symbolique: l'adresse d'où commence le tableau. Au lieu de cela, un pointeur a sa propre mémoire et peut pointer vers des adresses mémoire.
Il suffit que vous changiez int [] en int *.
De plus, les variables sont passées par copie, vous devez donc passer un int ** à la fonction.
À propos de l'utilisation de realloc, tous les exemples didactiques incluent ceci:
Ce serait donc un bel exemple:
int* chuck= (int*) realloc (NULL, 10*sizeof(int)); // Acts like malloc,
// casting is optional but I'd suggest it for readability
assert(chuck);
for(unsigned int i=0; i<10; i++)
{
chunk[i]=i*10;
printf("%d",chunk[i]);
}
free(chunk);
Les deux codes sont très problématiques, si vous utilisez le même pointeur pour envoyer et recevoir depuis realloc, s'il échoue, vous perdrez votre pointeur pour le libérer plus tard.
vous devriez faire quelque chose comme ça:
{... ...
more = realloc(area , size);
if( more == NULL )
free(area);
else
area=more;
... ...
}