91 votes

Quand dois-je utiliser malloc en C et quand ne dois-je pas le faire ?

Je comprends comment fonctionne malloc(). Ma question est la suivante : je vois des choses comme ça :

#define A_MEGABYTE (1024 * 1024)

char *some_memory;
size_t size_to_allocate = A_MEGABYTE;
some_memory = (char *)malloc(size_to_allocate);
sprintf(some_memory, "Hello World");
printf("%s\n", some_memory);
free(some_memory);

J'ai omis la vérification des erreurs pour des raisons de concision. Ma question est la suivante : ne pouvez-vous pas simplement faire ce qui précède en initialisant un pointeur vers un stockage statique en mémoire ? peut-être :

char *some_memory = "Hello World";

À quel moment devez-vous réellement allouer la mémoire vous-même au lieu de déclarer/initialiser les valeurs que vous devez conserver ?

129voto

codaddict Points 154968
char *some_memory = "Hello World";

crée un pointeur vers une constante de type chaîne. Cela signifie que la chaîne "Hello World" se trouvera quelque part dans la partie de la mémoire réservée à la lecture et que vous n'aurez qu'un pointeur sur elle. Vous pouvez utiliser la chaîne en lecture seule. Vous pouvez consulter le site ne peut pas y apporter des modifications. Exemple :

some_memory[0] = 'h';

c'est demander des ennuis.

D'autre part

some_memory = (char *)malloc(size_to_allocate);

alloue un tableau de caractères (une variable) et some_memory pointe vers cette mémoire allouée. Maintenant, ce tableau peut être lu et écrit. Vous pouvez maintenant le faire :

some_memory[0] = 'h';

et le contenu du tableau devient "hello World".

37voto

R Samuel Klatchko Points 44549

Pour cet exemple précis, malloc n'est pas d'une grande utilité.

La raison principale pour laquelle malloc est nécessaire est lorsque vous avez des données qui doivent avoir une durée de vie différente de celle du code. Votre code appelle malloc dans une routine, stocke le pointeur quelque part et appelle finalement free dans une autre routine.

Une raison secondaire est que le C n'a aucun moyen de savoir s'il reste suffisamment d'espace sur la pile pour une allocation. Si votre code doit être 100% robuste, il est plus sûr d'utiliser malloc car votre code peut alors savoir que l'allocation a échoué et la gérer.

16voto

moritz Points 1757

Malloc est un outil merveilleux pour allouer, réallouer et libérer de la mémoire au moment de l'exécution, par rapport aux déclarations statiques comme votre exemple hello world, qui sont traitées au moment de la compilation et dont la taille ne peut donc pas être modifiée.

Malloc est donc toujours utile lorsque vous traitez des données de taille arbitraire, comme la lecture du contenu d'un fichier ou le traitement des sockets, et que vous ne connaissez pas la longueur des données à traiter.

Bien sûr, dans un exemple trivial comme celui que vous avez donné, malloc n'est pas le "bon outil pour le bon travail" magique, mais pour des cas plus complexes (création d'un tableau de taille arbitraire au moment de l'exécution par exemple), c'est la seule solution.

6voto

ephemient Points 87003
char *some_memory = "Hello World";
sprintf(some_memory, "Goodbye...");

est illégal, les chaînes de caractères sont const .

Ceci allouera un tableau de 12 octets sur la pile ou globalement (selon l'endroit où il est déclaré).

char some_memory[] = "Hello World";

Si vous voulez laisser de la place pour d'autres manipulations, vous pouvez spécifier que la taille du tableau doit être plus grande. (Par contre, ne mettez pas 1MB sur la pile).

#define LINE_LEN 80

char some_memory[LINE_LEN] = "Hello World";
strcpy(some_memory, "Goodbye, sad world...");
printf("%s\n", some_memory);

5voto

Mark Wilkins Points 29291

L'une des raisons pour lesquelles il est nécessaire d'allouer la mémoire est que vous souhaitez la modifier au moment de l'exécution. Dans ce cas, on peut utiliser un malloc ou un tampon sur la pile. L'exemple simple de l'attribution de "Hello World" à un pointeur définit une mémoire qui ne peut "typiquement" pas être modifiée lors de l'exécution.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X