C - dynamic memory allocation mit Doppel-pointer
Ich bin die Zuweisung von Speicher in einer Funktion namens myalloc() und mit und befreien es in main().
Ich bin mit Doppel-pointer, um dies zu tun, hier ist der code, der funktioniert gut,
//Example # 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void myalloc( char ** ptr)
{
*ptr = malloc(255);
strcpy( *ptr, "Hello World");
}
int main()
{
char *ptr = 0;
myalloc( &ptr );
printf("String is %s\n", ptr);
free(ptr);
return 0;
}
Aber folgender code funktioniert nicht und gibt einen segmentation fault.
Ich denke, das ist eine andere Art der Verwendung von double-Zeigern.
//Example # 2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void myalloc( char ** ptr)
{
*ptr = malloc(255);
strcpy( *ptr, "Hello World");
}
int main()
{
char **ptr = 0;
myalloc( ptr );
printf("String is %s\n", *ptr);
free(*ptr);
return 0;
}
Bitte erläutern Sie mir, warum es ist mir seg Fehler im zweiten Beispiel.
Hinweis: Language = C, Compiler = GCC 4.5.1, OS = Fedora Core 14
Weiß ich auch, dass es einige Frage schon gefragt worden, bezogen auf Speicherreservierung mithilfe von double-Zeigern, aber Sie kümmern sich nicht um dieses Problem, also bitte nicht zu Kennzeichnen, als sich wiederholende Frage.
In beiden Beispiel, die ich vergaß zu ersetzen foo() mit myalloc().. ich entschuldige mich..
InformationsquelleAutor mannan | 2011-06-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
versucht, schreiben, die Zeiger zurückgegeben
malloc
an die Adresse(vom Typchar*
) wies auf die durch ptr. Die Adresse entpuppt sich ...0
, die nicht beschreibbaren Speicher.ptr
sollten zeigen Sie auf eine Adresse, die Sie schreiben kann. Führen Sie einen der folgenden Schritte aus:Ja, es ist Ihr erstes Beispiel, sans Initialisierung der Zeiger, der bekommt prompt überschrieben.
InformationsquelleAutor phihag
Übergeben Sie den Wert, den ptr-Punkte zu. Aber Sie havent wies ptr, um alles noch.
Nun bei der Zuweisung von Speicher für "nichts". Also das klappt nicht, und wird segfault.
Warum sagen Sie, dass dies ein anderer Weg der Verwendung von double-Zeigern? Ich entschuldige mich, wenn ich falsch bin, aber ich denke, man arbeitete mit Art von Programm in Turbo-C früher?
mannan: es gibt zwei Probleme hier. Die erste ist, dass es keine solche Sache wie eine "doppelte pointer" -, dass die Terminologie ist nicht eindeutig. Sie sprechen von einem Zeiger-auf-Zeiger-Typ. Das zweite problem ist, dass der Typ einer variable ist das, was Sie erklären es zu sein, und hat nichts zu tun mit, wie Sie Ihren Wert einstellen.
char *p = ...
deklariert und initialisiert einen Zeiger auf ein char, egal, was auf der rechten Seite der=
.char **ptr
deklariert einen Zeiger auf einen Zeiger auf einen char.Knechtel: vereinbart!
Der Begriff der Doppel-Zeiger ist verwirrend. Die Zeile, die Sie schrieb :
char **ptr = 0;
macht keinen Sinn, in den ersten Platz. Ein Zeiger auf einen Zeiger das macht, was es heißt : Sie verwenden es, um pointe auf einige Zeiger. Also, um es verwenden zu können, müssen Sie über einen gültigen Zeiger auf die Sie zeigen können. Sie waren nicht zu tun, dass in deinem Beispiel. Ich hoffe, ich mache Sinn.Verwenden Sie einen Zeiger-auf-Zeiger, wenn Sie es wirklich benötigen; nicht nur aus Gründen der Verwendung von es. Das war ein typisches Verhalten in meinem college (Indien). Der Grund, dass ich fragte Sie über die Turbo-C war, dass es verwendet, um alle akzeptieren solche Aufgaben statt, die einen segfault. Wenn Sie es verwenden, um es zu lernen, dann @Karl erklärte, seine Verwendung sehr gut.
InformationsquelleAutor Jayesh Bhoot
Im zweiten Fall, übergeben Sie den Wert von main ist
ptr
, die 0 (NULL), ummyalloc()
'sptr
.myalloc()
dann versucht zu dereferenzieren seine null-Zeiger ist,ptr
.InformationsquelleAutor Yew Long