Libérer des cordes en C

Si j’écrirais:

char *a=malloc(sizeof(char)*4); a="abc"; char *b="abc"; 

Ai-je besoin de libérer cette mémoire ou est-ce fait par mon système?

Dans votre cas, vous n’avez aucun moyen de libérer la mémoire allouée dynamic car vous perdez la référence.

Essayez ceci:

 #include  #include  int main() { char *a=(char*)malloc(sizeof(char)*4); printf("Before: %p\n",a); a = "abc"; printf("After: %p\n",a); free(a); char *b = "abc"; return 0; } 

Vous obtiendrez

 Before: 0x100100080 After: 0x100000f50 

Vous verrez que les deux pointeurs sont différents. Ceci parce que le littéral de chaîne "abc" est placé dans le secteur de données des fichiers binarys et

 a = "abc" 

vous changez le pointeur de a pour pointer sur la chaîne littérale constante "abc" et vous perdez la mémoire allouée précédemment. Appeler free sur a n’est plus correct, simplement parce qu’il ne pointe plus vers une adresse valide atsortingbuée dynamicment. Pour conserver le pointeur et pouvoir le libérer, vous devez copier la chaîne avec

 strncpy(a, "abc", 4) 

Cela copiera efficacement les caractères du littéral vers la méthode allouée dynamicment, en préservant le pointeur d’origine.

Vous avez une fuite de mémoire ici. Lorsque vous définissez a="abc" , vous ne remplissez pas la mémoire que vous venez d’allouer, vous réaffectez le pointeur sur la chaîne statique “abc”. b pointe sur la même chaîne statique.

Ce que vous voulez à la place, c’est strncpy(a, "abc", 4) , qui copiera le contenu de “abc” dans la mémoire que vous avez allouée (sur laquelle pointe a).

Ensuite, vous devrez le libérer une fois terminé.

Vous ne pouvez pas affecter une chaîne de cette manière avec C

 a = "abc" 

Cependant, si vous utilisez malloc vous devez utiliser free , comme ceci

 free(a); 

Mais faites attention si vous utilisez free(a) dans votre exemple, vous obtenez une erreur. Parce qu’après le malloc vous donnez au pointeur a valeur en chaîne statique "abc" ; Donc, le prochain free(a) essaie de libérer des données statiques. Et vous obtenez l’erreur.

Réponse simple oui, non. De plus, votre code est buggy.

Réponse concrète:

 char *a=malloc(sizeof(char)*4); 

Vous allouez de la mémoire, vous devriez donc la libérer.

 a="abc"; 

Ceci assigne un pointeur sur une chaîne constante à votre char* a . En le faisant, vous perdez le pointeur sur la mémoire allouée sur la première ligne, vous ne devriez jamais libérer de chaînes constantes.

Utilisez strcpy(a,"abc"); au lieu de a="abc"; pour déplacer la chaîne dans la mémoire allouée.

oui, vous devez libérer la mémoire renvoyée par malloc.

Oui, cela provoquera une fuite de mémoire. Le système n’a pas pu gérer le cas.