char x [256] par rapport à char * = malloc (256 * sizeof (char));
Quelqu'un ici l'a récemment souligné à moi dans un morceau de code de la mienne, je suis en utilisant
char* name = malloc(256*sizeof(char));
//more code
free(name);
J'étais sous l'impression que cette façon de mettre en place un tableau est identique à l'aide de
char name[256];
et que les deux modes nécessiterait l'utilisation de free(). Je suis mal et si oui, quelqu'un pourrait-il expliquer une baisse du niveau des termes quelle est la différence?
source d'informationauteur faceless1_14
Vous devez vous connecter pour publier un commentaire.
Dans le premier code, la mémoire est allouée dynamiquement sur le tas. Que la mémoire a besoin d'être libérée avec free(). Sa durée de vie est arbitraire: il peut traverser la fonction de limites, etc.
Dans le deuxième code, les 256 octets sont allouées sur la pile, et sont automatiquement récupéré lorsque la fonction renvoie (ou à la fin du programme, si elle est en dehors de toutes les fonctions). Si vous n'avez pas à (et ne peut) pas d'appeler free (). Il ne peut pas fuir, mais aussi de ne pas vivre au-delà de la fin de la fonction.
Choisir entre les deux, sur la base des exigences pour la mémoire.
Additif (Pax):
Si je peux ajouter à cela, Ned, la plupart des implémentations fournissent généralement plus de segment de pile (au moins par défaut). Ce ne sera pas généralement de la matière pour un total de 256 octets, sauf si vous êtes déjà en cours d'exécution hors de la pile ou de faire fortement récursive des trucs.
Aussi, sizeof(char) est toujours de 1 selon la norme de sorte que vous n'avez pas besoin de superflu de se multiplier. Même si le compilateur va probablement optimiser loin, il rend le code laid IMNSHO.
Fin additif (Pax).
Non, seul le premier besoin de l'utiliser gratuitement. La deuxième est alloué sur la pile. Qui le rend incroyablement rapide à allouer. Regardez ici:
Lors de sa création, le compilateur au moment de la compilation sait que sa taille et attribuera le droit de la taille de la pile. La pile est une grande partie de la mémoire continue situé quelque part. Mettre quelque chose à la pile juste incrément (ou décrément en fonction de votre plate-forme) les stackpointer. Aller hors de portée va faire l'inverse, et votre tableau est libéré. Que se fera automatiquement. Effet des variables créées de cette façon ont automatique durée de stockage.
À l'aide de malloc est différent. Il sera de l'ordre arbitrairement grand de la mémoire de morceau (à partir d'un endroit appelé freestore). L'exécution aura à la recherche d'un assez grand bloc de mémoire. La taille peut être déterminée au moment de l'exécution, de sorte que le compilateur ne peut généralement pas l'optimiser au moment de la compilation. Parce que le pointeur peut aller hors de portée, ou être copié autour, il n'est pas inhérente couplage entre la mémoire allouée, et le pointeur à qui l'adresse de la mémoire est affectée, de sorte que la mémoire est toujours allouée même si vous avez quitté la fonction il y a longtemps. Vous avez pour appeler gratuitement de le transmettre à l'adresse que vous avez obtenu à partir de malloc manuellement si le moment est venu de le faire.
Certains "récente" forme de C, appelé C99, vous permet de donner des tableaux d'une exécution de taille. I. e vous êtes autorisé à faire:
Mais cette fonctionnalité devrait être évitée si vous n'avez pas de raison de l'utiliser. Une des raisons est qu'il n'est pas infaillible: Si aucune mémoire n'est plus disponible, tout peut arriver. Une autre est que le C99 n'est pas très portable entre les compilateurs.
Il existe une troisième possibilité, qui est que le tableau peut être déclarée à l'extérieur de la fonction, mais de manière statique, par exemple,
J'ai été plutôt surpris dans les réponses à une autre question sur de SORTE que quelqu'un a estimé que c'était inapproprié dans C; ici il n'est même pas mentionné, et je suis un peu confus et surpris (comme "quels sont-ils enseigner à des enfants à l'école ces jours-ci?") à propos de cette.
Si vous utilisez cette définition, la mémoire est allouée de manière statique, ni sur le tas, ni la pile, mais dans l'espace de données dans l'image. Ainsi est ni, doit être géré avec malloc/free, ni ne vous avoir à vous soucier de l'adresse réutilisés comme vous le feriez avec une option d'auto-définition.
Il est utile de rappeler l'ensemble ", a déclaré" vs "défini" chose ici. Voici un exemple
Maintenant dans un tout autre fichier
C'est faux - la déclaration de tableau ne nécessite pas de gratuit. De plus, si c'est dans une fonction, il est alloué sur la pile (si ma mémoire est bonne) et est libéré automatiquement avec la fonction renvoie - ne pas passer une référence de retour à l'appelant!
Briser votre déclaration
Traduction: le nom est désormais un pointeur de caractère qui est assignée à l'adresse de la mémoire sur le tas
Traduction: le Nom est un pointeur constant vers un personnage que les points de la mémoire sur la pile
En C les tableaux et les pointeurs sont la même chose plus ou moins. Les tableaux sont constants des pointeurs de la mémoire. La principale différence est que lorsque vous appelez la fonction malloc vous prenez votre mémoire dans le tas et de la mémoire pris dans le tas doit être libéré dans le tas. Lorsque vous déclarez le tableau avec une taille de mémoire attribué à partir de la pile. Vous ne pouvez pas libérer cette mémoire car gratuit est fait pour libérer de la mémoire dans le tas. La mémoire sur la pile sera automatiquement libéré lorsque le programme actuel de l'unité retourne. Dans le deuxième exemple de free(p) serait une erreur aussi. p est un pointeur le nom de tableau sur la pile. Donc, en libérant de la p que vous essayez de libérer de la mémoire sur la pile.
Ce n'est pas différent de:
libérant p dans ce cas serait une erreur parce que les points p de n, qui est une variable sur la pile. Donc p est titulaire d'un emplacement de mémoire dans la pile et ne peut pas être libéré.
dans ce cas, le libre est la bonne parce que p pointe vers un emplacement de la mémoire sur le tas qui a été allouée par malloc.
selon l'endroit où vous exécutez ce, en l'espace de pile peut-être à une ÉNORME prime. Si, par exemple, vous écrivez BREW code pour Verizon/Alltel combinés, vous êtes généralement limité à de petits stacks mais croissante tas d'accès.
Aussi, en tant que char[] sont le plus souvent utilisées pour les cordes, c'est pas une mauvaise idée pour permettre à la chaîne de la construction de la méthode pour allouer de la mémoire dont il a besoin pour la chaîne en question, plutôt que d'espérer que, pour toujours et toujours 256 (ou quel que soit le nombre vous du décret) suffira.