web-dev-qa-db-fra.com

Comment utiliser realloc dans une fonction en C

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é.

32
Legendre

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);
30
simonc

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:

  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 lorsque vous n'en avez plus besoin.

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);
7
Ramy Al Zuhouri

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;

... ...

}

4
user8036942