Libérant des chaînes de caractères en C
Si je voulais écrire:
char *a=malloc(sizeof(char)*4);
a="abc";
char *b="abc";
ai-je besoin de libérer cette mémoire, ou est-il fait par mon système?
- Une autre observation est que je crois que vous n'avez pas besoin sizeof(char) depuis dans toutes les implémentations j'ai vu jusqu'à présent c'est toujours de 1 octet. Donc malloc(4); il suffirait d'une
- en fait au-dessus de la mise en œuvre est bonne. Bien que la plupart des systèmes utilisent un octet caractères, la mise en œuvre au-dessus de la laisse clairement ce qui est alloué, et si le code est modifié pour utiliser unichars, qui sont généralement de deux octets, alors il sera plus facile de changer.
- J'ai peur, je ne suis pas sûr de ce que exactement un unichar est, mais je suppose que cela a à faire avec unicode. Une rapide recherche sur google suggère objective-c qui est une autre langue 😛 Mais tous les caractères unicode ne sont généralement pas appelé tout à l'omble chevalier. Prendre caractères larges wchar_t par exemple. Peut-être tort, mais c'est ce que j'ai vu jusqu'à présent avec les implémentations j'ai traité avec
- Oui, un unichar est un caractère Unicode, mais le concept n'est pas spécifique à l'objective-C. En général n'est pas une bonne idée de faire des hypothèses sur la taille des structures de données.
Vous devez vous connecter pour publier un commentaire.
Dans votre situation, vous n'aurez aucun moyen de libérer la dynamique de la mémoire allouée parce que vous sont en train de perdre la référence à elle.
Essayez ceci:
Vous obtiendrez
Vous verrez que les deux pointeurs sont différents. Cela parce que la chaîne de caractères littérale
"abc"
est placé dans le secteur de données des fichiers binaires et quand vous ne levous sont en train de changer le pointeur de
a
à point pour la constante de chaîne littérale"abc"
et vous font perdre de la déjà de la mémoire allouée. L'appel defree
sura
n'est pas correct de plus, juste parce qu'il ne pointe pas vers un valide allouée dynamiquement adresse plus. Afin de préserver le pointeur et être en mesure de le libérer, vous devez copier la chaîne avecCela aura pour effet de copier les caractères à partir du sens littéral de la allouée dynamiquement la méthode, la préservation de l'original pointeur.
strcpy
copiestrlen(source)
sans se soucier de la destination de la taille. Si la longueur de la source > dest longueur, alors il va écrire en dehors de limites.strncpy
vous aurez à libérer la mémoire avecfree(a)
à la fin du code.Vous avez une fuite de mémoire ici. Lorsque vous définissez
a="abc"
, vous n'êtes pas le remplissage de la mémoire que vous venez alloué, vous êtes à réaffecter le pointeur sur la statique de la chaîne "abc".b
points à la même chaîne statique.Ce que vous voulez, au contraire, est
strncpy(a, "abc", 4)
, qui permet de copier le contenu de "abc" dans la mémoire allouée (quia
points).Alors vous auriez besoin de libérer lorsque vous avez terminé.
Simple réponse oui,non. Aussi votre code est bogué.
Réponse concrète:
Allouer de la mémoire de sorte que vous devriez gratuit.
Il attribue un pointeur vers une chaîne constante à votre
char* a
, ce faisant, vous perdez le pointeur vers la mémoire allouée dans la première ligne, vous ne devriez jamais gratuitement les chaines.Utilisation
strcpy(a,"abc");
au lieu dea="abc";
pour déplacer la chaîne dans votre mémoire allouée.Vous ne pouvez pas affecter la chaîne de cette façon, avec C
Toutefois, si vous utilisez
malloc
alors vous devez utiliserfree
, à l'instar de ceMais attention si vous utilisez
free(a)
dans votre exemple, vous obtiendrez une erreur. Parce que, après lemalloc
vous changer le pointeur de laa
de la valeur à la chaîne statique"abc"
;Donc, la prochaine
free(a)
essayer de libérer de l'une des données statiques. Et vous obtenez l'erreur.oui, vous avez besoin de libérer de la mémoire retourné par malloc.
Oui, il va provoquer une fuite de mémoire. Le système ne peut pas gérer le cas.