Comment utiliser realloc en C [duplicate]

Nov 25 2020

J'essaye de réallouer de la mémoire en utilisant la fonction realloc, j'ai vu que vous deviez utiliser malloc avant mais je ne comprends pas si vous DEVEZ l'utiliser car disons que je crée la chaîne suivante:

char string[] =  "fun";

la fonction de réallocation fonctionnerait-elle si j'essaie d'ajouter plus d'espace?

cela m'amène à ma question, j'essaie simplement d'ajouter une lettre à la fin de la chaîne, disons «p», mais pour une raison quelconque, le programme écrase la ligne de réallocation à chaque fois que je l'exécute.

Voici mon code complet:

int main()
{
char string[] =  "fun" ;
str_func(string);
printf("%s", string);
return 0;
} 

void str_func(char* str)
{
str = (char*)realloc(str, strlen(str) + 2);
strcat(str, "p");
}

J'ai également essayé de créer un pointeur vers 'string' et d'envoyer le pointeur, ce qui donne la même chose.

Réponses

1 Lundin Nov 25 2020 at 19:32

la fonction de réallocation fonctionnerait-elle si j'essaie d'ajouter plus d'espace?

Non, car ce tableau n'est pas alloué sur le tas - dans votre cas, il est très probablement alloué sur la pile et ne peut pas être redimensionné. En termes simples: reallocne reconnaît pas le pointeur et ne sait pas quoi en faire, mais essaie quand même de faire quelque chose, d'où le crash.

Vous ne pouvez appeler que reallocsur un pointeur qui a été précédemment passé mallocou sur un pointeur nul. C'est ainsi que fonctionnent ces fonctions.

Pour plus d'informations, consultez Qu'est - ce qui est alloué sur la pile et le tas? .

1 Useless Nov 25 2020 at 19:58

J'ai vu que vous deviez utiliser malloc avant mais je ne comprends pas si vous DEVEZ l'utiliser

Si vous devez utiliser mallocavant de pouvoir reallocquelque chose, vous ne devez par définition que les reallocéléments initialement alloués malloc.

Vous essayez de trouver un espace entre «besoin» et «doit» qui n'existe pas.

... pour une raison quelconque, le programme craque pour la réallocation

Vous avez déjà dit que vous savez que vous devez utiliser malloc. Ensuite, vous ne l'avez pas utilisé mallocet vous vous demandez pourquoi c'est un problème. Vous pouvez au moins essayer de faire ce que vous «savez» faire, pour voir si cela résout le problème.

Le programme devrait probablement ressembler à

int main()
{
  /* array is an automatic local variable. It wasn't dynamically allocated
     in the first place, so can't be dynamically re-allocated either.
     You cannot (and don't need to) free it either, it just goes out of scope
     like any other automatic variable.
  */
  char array[] = "fun";

  /* you need to use malloc (or one of the other dynamic allocation functions)
     before you can realloc, as you said yourself */
  char *dynamic = malloc(1+strlen(array));
  memcpy(dynamic, array, 1+strlen(array));

  /* realloc can move your data, so you must use the returned address */
  dynamic = str_func(dynamic);
  printf("old:'%s', new:'%s'\n", array, dynamic);

  /* not really essential since the program is about to exit anyway */
  free(dynamic);
} 

char* str_func(char* str)
{
  char* newstr = realloc(str, strlen(str) + 2);
  if (newstr) {
    strcat(newstr, "p");
    return newstr;
  } else {
    /* we failed to make str larger, but it is still there and should be freed */
    return str;
  }
}

Votre condition d'origine n'est pas tout à fait correcte: en fait le pointeur est passé à realloc

... doit être préalablement alloué par malloc(), calloc()ou realloc()et pas encore libéré avec un appel à free ou realloc

[OU] Si ptr est NULL, le comportement est le même que pour appeler malloc(new_size).

paxdiablo Nov 25 2020 at 19:31

La reallocfonction fonctionne uniquement avec les choses qui ont été créés à l' origine avec un petit groupe de fonctions d'allocation (tels que malloc, callocou realloclui - même), ou le pointeur NULL. Puisqu'il stringn'y a rien de tout cela, votre code n'est pas bien défini.