Comment utiliser realloc en C [duplicate]
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
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: realloc
ne 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 realloc
sur un pointeur qui a été précédemment passé malloc
ou 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? .
J'ai vu que vous deviez utiliser malloc avant mais je ne comprends pas si vous DEVEZ l'utiliser
Si vous devez utiliser malloc
avant de pouvoir realloc
quelque 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é malloc
et 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()
ourealloc()
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)
.
La realloc
fonction fonctionne uniquement avec les choses qui ont été créés à l' origine avec un petit groupe de fonctions d'allocation (tels que malloc
, calloc
ou realloc
lui - même), ou le pointeur NULL. Puisqu'il string
n'y a rien de tout cela, votre code n'est pas bien défini.