Je suis particulièrement concentré sur l'utilisation de malloc sur les pointeurs char
char *ptr;
ptr = "something";
...code...
...code...
ptr = "something else";
Un malloc serait-il en ordre pour quelque chose d'aussi insignifiant que cela? Si oui, pourquoi? Sinon, quand est-il nécessaire pour les pointeurs de caractères?
Comme cela a été indiqué par d'autres, vous n'avez pas besoin d'utiliser malloc uniquement pour faire:
const char *foo = "bar";
La raison en est exactement que *foo
is un pointeur - lorsque vous initialisez foo
vous ne créez pas une copie de la chaîne, juste un pointeur vers où "bar"
Réside dans la section des données de votre exécutable. Vous pouvez copier ce pointeur aussi souvent que vous le souhaitez, mais n'oubliez pas qu'ils pointent toujours vers la même instance unique de cette chaîne.
Alors, quand devriez-vous utiliser malloc? Normalement, vous utilisez strdup()
pour copier une chaîne, qui gère le malloc en arrière-plan. par exemple.
const char *foo = "bar";
char *bar = strdup(foo); /* now contains a new copy of "bar" */
printf("%s\n", bar); /* prints "bar" */
free(bar); /* frees memory created by strdup */
Maintenant, nous arrivons enfin à un cas où vous voudrez peut-être malloc si vous utilisez sprintf()
ou, plus sûrement snprintf()
qui crée/formate une nouvelle chaîne.
char *foo = malloc(sizeof(char) * 1024); /* buffer for 1024 chars */
snprintf(foo, 1024, "%s - %s\n", "foo", "bar"); /* puts "foo - bar\n" in foo */
printf(foo); /* prints "foo - bar" */
free(foo); /* frees mem from malloc */
malloc
sert à allouer de la mémoire sur le free-store. Si vous avez un littéral de chaîne que vous ne souhaitez pas modifier, ce qui suit est correct:
char *literal = "foo";
Cependant, si vous voulez pouvoir le modifier, utilisez-le comme tampon pour contenir une ligne d'entrée et ainsi de suite, utilisez malloc
:
char *buf = (char*) malloc(BUFSIZE); /* define BUFSIZE before */
// ...
free(buf);
Utilisez malloc()
lorsque vous ne connaissez pas la quantité de mémoire nécessaire pendant la compilation. Si vous avez des chaînes en lecture seule, vous pouvez utiliser const char* str = "something";
. Notez que la chaîne est très probablement stockée dans un emplacement mémoire en lecture seule et vous ne pourrez pas la modifier. D'un autre côté, si vous connaissez la chaîne pendant le temps de compilation, vous pouvez faire quelque chose comme: char str[10]; strcpy(str, "Something");
Ici, la mémoire est allouée à partir de la pile et vous pourrez modifier la chaîne. Le troisième cas est l'allocation à l'aide de malloc. Disons que vous ne connaissez pas la longueur de la chaîne pendant la compilation. Ensuite, vous pouvez faire char* str = malloc(requiredMem); strcpy(str, "Something"); free(str);
malloc pour les caractères uniques ou les entiers et calloc pour les tableaux dynamiques. c'est-à-dire pointer = ((int *)malloc(sizeof(int)) == NULL)
, vous pouvez faire de l'arithmétique entre les crochets de malloc
mais vous ne devriez pas parce que vous devez utiliser calloc
qui a la définition de void calloc(count, size)
ce qui signifie comment de nombreux éléments que vous souhaitez stocker, par exemple le nombre et la taille des données, par exemple int
, char
etc.
Chaque fois que la taille de la chaîne est indéterminée au moment de la compilation, vous devez allouer de la mémoire avec malloc (ou une méthode équivalente). Dans votre cas, vous connaissez la taille de vos chaînes au moment de la compilation (sizeof ("quelque chose") et sizeof ("autre chose")).