Je suis en train d'apprendre le langage C à partir du livre de K.N.King et je suis en train de faire les projets de programmation du chapitre 17. J'ai rencontré un bug auto-infligé alors que je terminais le premier projet. C'était un comportement indéfini du programme car je passais à realloc() une copie d'un pointeur retourné par un appel précédent à malloc(), puisque l'appel à realloc() se produisait dans une fonction autre que main(). Après avoir relu certaines parties du chapitre, j'ai réalisé que realloc() a un comportement indéfini dans ce cas.
J'ai essayé de rechercher pourquoi c'est le cas sans succès. Est-ce que quelqu'un ici sait pourquoi le pointeur passé à realloc() doit être un pointeur retourné par un appel précédent à malloc(), calloc() ou realloc() et non une copie de ceux-ci ? De plus, ne faisons-nous pas intrinsèquement toujours une copie d'un pointeur retourné par realloc() chaque fois que nous voulons redimensionner un bloc mémoire ?
int num_parts = 0, max_parts = 10;
int main(void)
{
struct part *inventory = malloc(max_parts * sizeof(*inventory));
\\...
switch(ch) {
\\...
case 'i':
insert(inventory, &num_parts, &max_parts);
break;
\\...
}
}
void insert(struct part *inventory, int *num_parts, *max_parts)
{
if (*num_parts == *max_parts) {
*max_parts += 10;
struct part *temp = realloc(inventory, max_parts * sizeof(*temp));
if (temp != NULL)
inventory = temp;
else
printf("Erreur:...\n");
}
\\...
}