Comment utiliser realloc dans une fonction en C

Construire sur ce que j’ai appris ici: Manipuler un tableau dynamic à l’aide de 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); } 

Ceci est conforme mais le programme se bloque lors de son exécution.

Question

Comment utiliser realloc dans une fonction?

Je comprends que je devrais affecter le résultat de realloc à une variable et vérifier si elle est NULL premier. Ceci est juste un exemple simplifié.

Vous voulez modifier la valeur d’un int* (votre tableau), vous devez donc lui passer un pointeur dans votre fonction d’ 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 bloc de mémoire dans la stack, et c’est tout. Si vous avez un tableau:

 int arr[100]; 

Alors arr est une adresse de mémoire, mais & arr est aussi une adresse de mémoire, et cette adresse de mémoire est constante et n’est 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 du début du tableau. Au lieu de cela, un pointeur a sa propre mémoire et peut pointer sur 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:

  1. Utilisez realloc;
  2. Vérifiez si c’est NULL. Dans ce cas, utilisez perror et quittez le programme.
  3. Si ce n’est pas NULL, utilisez la mémoire allouée;
  4. Libérez la mémoire quand vous n’en avez plus besoin.

Donc, ce serait 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 de realloc, s’il échoue, vous perdrez votre pointeur pour le libérer ultérieurement.

vous devriez faire quelque chose comme ça:

{… …

 more = realloc(area , size); if( more == NULL ) free(area); else area=more; 

… …

}