Welche der folgenden code-Zeile mit malloc?
Habe ich die folgende Implementierung Spiegel der binäre Baum.
#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;
}
Mir geht es um die folgende Zeile:
struct node* node = (struct node*)
malloc(sizeof(struct node));
Habe ich fortgeschrittene Kenntnisse in c/c++, aber ich bin mir ziemlich Angst vor der Zeiger. Auch nach mehreren versuchen habe ich nie in der Lage, Zeiger. Ich vermeide Sie so weit wie möglich, aber wenn Sie kommen, um die Implementierung von Datenstrukturen wie Bäume, es gibt keine anderen Optionen. Warum sind wir mit malloc und sizeof hier? Auch, warum sind wir casting (struct Knoten*)?
prüfen Sie die Antwort. Wenn Sie finden, dass irgendetwas fehlt, fühlen Sie sich frei zu Fragen.
InformationsquelleAutor rishiag | 2013-09-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zunächst casting bei der Verwendung von malloc in C ist nicht notwendig. (siehe hier)
Sind Sie malloc-ing, weil Sie die Zuweisung heap-Speicher von der Größe eines Knotens struct. Sie sehen in C haben Sie im Auge zu behalten, wo alle Variablen gespeichert werden. Nämlich die
stack
undheap
(siehe hier)Innerhalb einer Funktion die Variablen bezeichnet werden lokale Variablen, die ist gespeichert in der
stack
. Einmal verlassen Sie die Funktion, die Variablen im stack gelöscht werden.In der Lage sein zu Referenz-oder verwenden Sie lokale Variablen außerhalb der Funktion, die Sie haben, um Speicher zuzuweisen, die in der
heap
, das ist, was Sie hier tun. Sie sind beim reservieren von Speicher im heap, so dass Sie die Wiederverwendung der gleichen variable in anderen Funktionen als gut.In der Zusammenfassung:
Ihnen ein Beispiel zu geben, warum, betrachten Sie den folgenden code:
Seine ziemlich einfach,
main
ist einfach eine Funktion aufrufensome_str_func
gibt eine lokale variablesome_str
auszuwerten, um das obige code würde funktionieren, aber nicht ohne Warnungen:Obwohl es kompiliert beachten Sie, dass
some_str
imsome_str_func()
ist Rückkehr eine lokale variable der Funktion (d.h. in der Funktion stack). Da der stack wird gelöscht, sobald Sie die Funktion verlassensome_str_func()
immain()
es würde nicht möglich sein, um den Inhalt dersome_str
die "Hallo Welt".Wenn Sie versuchen, führen Sie es bekommen:
Druckt er nichts, weil er nicht zugreifen kann
some_str
. Um Abhilfe zu schaffen, die Sie zuordnen, einige Speicherplatz für den string "Hello World" statt. etwa so:Wenn Sie jetzt kompilieren und ausführen, erhalten Sie:
Wenn Sie eine harte Zeit Verständnis C, ich weiß, viele Leute finden "The C Programming Language" von Brian W. Kernighan und Dennis Ritchie eine wirklich gute Referenz, allerdings eine moderne und grafische (auch Spaß zu Lesen! ernst) Buch ist Head First C Von David und Dawn Griffiths, erklären Sie viele wichtige C-Konzepte wie Heap und Stack, Unterschied zwischen dynamischen und statischen C-Bibliotheken, weshalb die Verwendung von Makefiles ist eine gute Idee, wie macht funktioniert, und viele weitere Konzepte, die vorher nicht erklärt, in gemeinsamen C-Bücher, die definitiv einen Blick Wert.
Andere gute online-Ressource ist Zed Shaws Learn C the Hard way, in denen er liefert gute code-Beispiele und Anmerkungen.
Das Ergebnis
malloc
ist ein Zeiger auf nicht initialisierten Speicher. im Gegensatz zunew
. man kann sagen, dassnew T(args)
~=malloc(sizeof(T))
+T(args)
.Wäre es sinnvoll zu erwähnen, dass dies alles über "the heap" und "stack" ist nicht etwas, was erwähnt wird in der Norm. Zum Beispiel, auf einigen embedded-Plattformen, es gibt keinen heap, und
malloc()
simplu gibt einen Zeiger auf "einige Speicher, die nicht den Stapel" (siehe Umsetzung dermalloc()
in der AVR-libc, zum Beispiel).Chutsu Kleines problem, wenn Sie verwendet
strcpy()
Sie brauchen nicht zu kündigen string explizit so entfernensome_str[12] = '\0'; /* remember to null terminate */
von code. Sowieso gute Antwort.Aktualisiert die Antwort, @GrijeshChauhan Dank für das heads-up 🙂
InformationsquelleAutor chutsu
Lesen:
void *malloc(size_t size);
Entsprechend, in
du Arbeitsspeicher zuweisen Stück
size = sizeof naode
bytes und Adresse Rückgabe von malloc gespeichert innode
Zeiger.Hinweis Sie haben Fehler variable name sollte nicht
node
wie es ist struct name. Sie können! aber Keine gute Praxis, wenn. Auchsizeof(*pointer)
ist bevorzugt übersizeof(Type)
im Fall der Typ jemals geändertAnmerkung: Es ist sicher nicht zu vermeiden, Guss-Adresse zurück, die durch malloc und calloc-Funktion. Lesen: Tun, und ich warf das Ergebnis von malloc?
Also
korrigierenvorzuziehen, die form der obigen Aussage ist:Zwei Korrekturen: (1) Entfernen festgelegten und (2) ändern Sie die variable name auf
nd
.sizeof(*pointer)
ist bevorzugt übersizeof(Type)
im Falle der Typ ist immer geändert.Ist es ?? ... interessant. Ich wieder von dir, kopieren 🙂 Danke!
http://ideone.com/SRPXVg
Vielen Dank H2co3 Mann. Weiter sollte es nicht richtig sein, in C++, weil in C++ können wir verwenden, Struktur, ohne struct-Schlüsselwort .Bin ich richtig?
Es sieht aus wie Sie sind.
InformationsquelleAutor Grijesh Chauhan
Mit
sizeof
-sizeof
(T) wird Ihnen sagen, die Anzahl der bytes, die erforderlich ist zum speichern einer Variablen des Typs " TMit
malloc
-Malloc reserviert Speicher dynamisch, d.h. zur Laufzeit (wenn das Programm tatsächlich ausgeführt wird, indem Sie CPU und Speicher). Wir verwenden diese vor allem, wenn wir sind nicht sicher über die Menge an Speicher, die zur Laufzeit benötigt werden. Also haben wir die dynamische Zuordnung zur Laufzeit mit
malloc
.Mit (
struct node*
)-Malloc
gibt einen Zeiger auf einen Speicherblock, der mit der Menge an Speicherplatz, die Sie gebeten, für die (im Parameter). Dieser Raum ist nur etwas Platz im Speicher. Somit ist dieser pointer hat kein Typ zugeordnet. Wir werfen dieser Zeiger (struct node*
), weil damit die Maschine weiß, dass die Variablen vom Typ (struct node
) werden gespeichert in diesem Speicher.InformationsquelleAutor halkujabra
Und nicht gegossen das Ergebnis
malloc
.Müssen Sie auch in diesem Speicher frei:
InformationsquelleAutor pzaenger
verwenden Sie malloc, in der Regel lassen die Zeiger haben etwas zu zeigen.
ist ein Zeiger nur wie eine Adresse und das Gebäude steht an der Adresse aufgebaut ist, die von malloc-oder zumindest die Größe benötigt, um dieses Gebäude zu bauen -- was Sie bauen, es ist bis zu Ihnen.
in deinem Beispiel jeder Knoten im Baum ist die Anzahl der zugeordneten bytes mit malloc, die Größe des Knotens ist die Anzahl der bytes benötigt, um zu halten alle den Inhalt des Knotens.
den binären Baum wird das jeden seiner Knoten zugeordnet, der mit malloc, wo im Speicher ist irrelevant, und das ist vielleicht das Ding, das ist ein bisschen schwierig zu verstehen, mit malloc und Zeiger. wie lange gibt es die Zeiger an jene Orte, alles ist gut.
InformationsquelleAutor Anders
alocates genügend Raum für eine
node
StrukturInformationsquelleAutor Farouk Jouti