Ce que la ligne de code suivante avec malloc?
J'ai la suite de la mise en œuvre de miroir de l'arbre binaire.
#include<stdio.h>
#include<stdlib.h>
/* A binary tree node has data, pointer to left child
and a pointer to right child */
struct node
{
int data;
struct node* left;
struct node* right;
};
/* Helper function that allocates a new node with the
given data and NULL left and right pointers. */
struct node* newNode(int data)
{
struct node* node = (struct node*)
malloc(sizeof(struct node));
node->data = data;
node->left = NULL;
node->right = NULL;
return(node);
}
/* Change a tree so that the roles of the left and
right pointers are swapped at every node.
So the tree...
4
/\
2 5
/\
1 3
is changed to...
4
/\
5 2
/\
3 1
*/
void mirror(struct node* node)
{
if (node==NULL)
return;
else
{
struct node* temp;
/* do the subtrees */
mirror(node->left);
mirror(node->right);
/* swap the pointers in this node */
temp = node->left;
node->left = node->right;
node->right = temp;
}
}
/* Helper function to test mirror(). Given a binary
search tree, print out its data elements in
increasing sorted order.*/
void inOrder(struct node* node)
{
if (node == NULL)
return;
inOrder(node->left);
printf("%d ", node->data);
inOrder(node->right);
}
/* Driver program to test mirror() */
int main()
{
struct node *root = newNode(1);
root->left = newNode(2);
root->right = newNode(3);
root->left->left = newNode(4);
root->left->right = newNode(5);
/* Print inorder traversal of the input tree */
printf("\n Inorder traversal of the constructed tree is \n");
inOrder(root);
/* Convert tree to its mirror */
mirror(root);
/* Print inorder traversal of the mirror tree */
printf("\n Inorder traversal of the mirror tree is \n");
inOrder(root);
getchar();
return 0;
}
Je parle de la ligne suivante:
struct node* node = (struct node*)
malloc(sizeof(struct node));
J'ai une connaissance intermédiaire de c/c++ mais j'ai bien peur de pointeurs. Même après plusieurs tentatives je n'ai jamais été en mesure d'obtenir des pointeurs. - Je les éviter autant que possible, mais quand venir à la mise en œuvre de structures de données comme les arbres il n'y a pas d'autres options. Pourquoi sommes-nous à l'aide de malloc et sizeof ici? Pourquoi sommes-nous casting (struct noeud*)?
de vérifier la réponse. Si vous trouvez quelque chose qui manque, n'hésitez pas à demander.
OriginalL'auteur rishiag | 2013-09-21
Vous devez vous connecter pour publier un commentaire.
Tout d'abord de casting lors de l'utilisation de malloc en C n'est pas nécessaire. (voir ici)
Vous malloc-ing parce que vous allouez de la mémoire du tas de la taille d'un nœud struct. Vous voyez en C, vous devez garder à l'esprit où toutes les variables sont stockées. À savoir la
stack
etheap
(voir ici)L'intérieur d'une fonction des variables sont appelées variables locales, qui est stocké dans le
stack
. Une fois que vous quittez la fonction de variables dans la pile sont effacées.Pour être en mesure de renvoi ou d'utiliser des variables locales à l'extérieur de la fonction, vous devez allouer de la mémoire dans le
heap
, qui est ce que vous faites ici. Vous allouez de la mémoire dans le tas, de sorte que vous pouvez réutiliser la même variable dans d'autres fonctions.En résumé:
Pour vous donner un exemple, pourquoi, considérons le code suivant:
Son assez simple,
main
est tout simplement l'appel d'une fonctionsome_str_func
qui renvoie une variable localesome_str
, de compiler le code ci-dessus, mais pas sans avertissements:Bien qu'il compile noter que
some_str
danssome_str_func()
est retour d'une variable locale à la fonction (c'est à dire dans le fonctionnement de la pile). Car la pile est effacé une fois que vous quittez la fonctionsome_str_func()
, dansmain()
il serait pas être possible pour obtenir le contenu desome_str
qui est "Hello World".Si vous tentez de l'exécuter, vous obtenez:
Il imprime rien, parce qu'il ne peut pas accéder à
some_str
. Pour y remédier, il vous allouer de l'espace mémoire pour la chaîne "Hello World" à la place. comme:Maintenant, lorsque vous compilez et exécutez-le, vous obtenez:
Si vous rencontrez un moment difficile la compréhension de C, je sais que beaucoup de gens à trouver "The C Programming Language" par Brian W. Kernighan et Dennis Ritchie vraiment une bonne référence, mais un plus moderne et graphique (même plaisir à lire! sérieusement) le livre est La Tête La Première C Par David et Aurore Griffiths, ils expliquent le nombre important C concepts tels que la Tas et de la Pile, la différence entre les dynamiques et statiques des bibliothèques C, pourquoi utiliser des fichiers "Makefile" est une bonne idée, comment Faire le travail, et beaucoup d'autres concepts pas expliqué précédemment dans la commune de C livres, certainement en valeur un regard.
Une autre bonne ressource en ligne est Zed Shaws Apprendre C la Dure, dans lequel il fournit de bons exemples de code et des notes.
Le résultat de
malloc
est un pointeur vers une mémoire non initialisée. contrairement ànew
. vous pouvez dire quenew T(args)
~=malloc(sizeof(T))
+T(args)
.Il serait intéressant de parler de ce que tout cela à propos de "le tas", et "la pile" n'est pas quelque chose mentionnée dans la Norme. Par exemple, sur certaines plateformes embarquées, il n'y a pas de tas, et
malloc()
simple renvoie un pointeur vers "une mémoire qui n'est pas la pile" (voir la mise en œuvre demalloc()
dans l'AVR-libc, par exemple).Chutsu Petit problème si vous avez utilise
strcpy()
vous n'avez pas besoin de résilier chaîne explicitement supprimersome_str[12] = '\0'; /* remember to null terminate */
de code. De toute façon la bonne réponse.Mise à jour de la réponse, @GrijeshChauhan merci pour le heads up 🙂
OriginalL'auteur chutsu
Lire:
void *malloc(size_t taille);
En conséquence, dans
vous allouez de la mémoire morceau de
size = sizeof naode
octets et l'adresse de retour de malloc stockées dansnode
pointeur.Note Vous avez erreur de nom de variable ne doit pas être
node
comme il est struct nom. Vous pouvez! mais Pas de la bonne pratique, cependant. Aussi,sizeof(*pointer)
est préféré ausizeof(Type)
dans le cas où le type est jamais modifiéNote de côté: Il est plus sûr pour éviter de ne pas jeter l'adresse de retour par malloc et calloc fonction. lire: Dois-je cast le résultat de la fonction malloc?
Donc
correctpréférable formulaire de déclaration ci-dessus est:Deux rectifications: (1) Retirez le transtypage et (2) changement de nom de la variable à
nd
.sizeof(*pointer)
est préféré ausizeof(Type)
dans le cas où le type est jamais modifié.S'agit-il ?? ... intéressant. J'ai de nouveau copier de vous 🙂 Merci!
http://ideone.com/SRPXVg
Merci beaucoup H2co3 homme. Ensuite, il ne devrait pas être correcte en C++ et en C++ on peut utiliser la structure de nom, sans le mot-clé struct .Suis-je la corriger?
On dirait que vous êtes.
OriginalL'auteur Grijesh Chauhan
À l'aide de
sizeof
-sizeof
(T) indique le nombre d'octets nécessaires pour stocker une variable de type TÀ l'aide de
malloc
-Malloc alloue dynamiquement la mémoire, qui est, au moment de l'exécution (lorsque votre programme est exécuté par un PROCESSEUR et de sa mémoire). Nous utilisons cette surtout quand nous ne sommes pas sûr de la quantité de mémoire qui est nécessaire à l'exécution. Nous avons donc allouer dynamiquement lors de l'exécution à l'aide de
malloc
.À l'aide de (
struct node*
)-Malloc
retourne un pointeur vers un bloc de mémoire avec la quantité d'espace que vous avez demandé (dans ses paramètres). Cet espace est juste un peu d'espace dans la mémoire. Ainsi, ce pointeur n'a pas de type associé. Nous avons lancé ce pointeur (struct node*
) car il va permettre à l'ordinateur de savoir que les variables de type (struct node
) vont être enregistrées dans cette mémoire.OriginalL'auteur halkujabra
Et ne jettent pas le résultat de
malloc
.Vous avez également besoin de libérer cette mémoire:
OriginalL'auteur pzaenger
vous utilisez la fonction malloc de typiquement les pointeurs ont quelque chose à point.
un pointeur est une adresse de rue et le bâtiment qui se dresse sur l'adresse, est construit par malloc -- ou au moins de la taille nécessaire pour construire le bâtiment -- ce que vous construisez, il est à vous.
dans votre exemple chaque nœud de l'arbre est un nombre d'octets alloué avec malloc, la taille du nœud est le nombre d'octets nécessaires pour contenir tout le contenu du nœud.
de l'arbre binaire permettra d'obtenir de chacun de ses nœuds alloué avec malloc, où la mémoire est hors de propos et qui est peut-être la chose qui est un peu difficile à comprendre avec malloc et des pointeurs. tant qu'il y a des pointeurs vers ces endroits, tout est bien.
OriginalL'auteur Anders
alocates suffisamment d'espace pour contenir un
node
structureOriginalL'auteur Farouk Jouti