Zuweisen von Speicher -, Doppel-Zeiger?
Ich habe Schwierigkeiten zu verstehen, wie Speicher zuweisen
auf ein double-Zeiger.
Ich will Lesen ein array von strings und speichern Sie es.
char **ptr;
fp = fopen("file.txt","r");
ptr = (char**)malloc(sizeof(char*)*50);
for(int i=0; i<20; i++)
{
ptr[i] = (char*)malloc(sizeof(char)*50);
fgets(ptr[i],50,fp);
}
statt diese ich weisen Sie einfach einen großen Speicherblock und
speichern Sie die Zeichenfolge
char **ptr;
ptr = (char**)malloc(sizeof(char)*50*50);
wäre das falsch? Und wenn ja, warum ist das so?
Nennen Sie es nicht eine "doppelte pointer" - dies bekommt Sie off auf dem falschen Fuß geistig - es ist ein Zeiger auf einen Zeiger.
InformationsquelleAutor lazy_hack | 2010-02-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre zweite Beispiel ist falsch, weil jeder memory location konzeptionell würde nicht halten eine
char*
sondern einechar
. Wenn Sie leicht ändern Sie Ihr denken, kann es helfen, mit diesem:Weil, Ihre erste Schleife wäre, wie man in C ein array von Zeichen-arrays/Zeigern. Mit einem festen block von Speicher für ein array von Zeichen-arrays ist ok, aber würden Sie einen einzigen
char*
eher als einechar**
, da Sie keine Zeiger in den Speicher, nurchar
s.char *str = x+(ii*50)
?Und nicht gegossen, das Ergebnis
malloc()
!InformationsquelleAutor user7116
ich gebe ein Beispiel, das vielleicht klar, der Zweifel,
InformationsquelleAutor Abhishek D K
Einem Doppel-pointer ist nur ein Zeiger auf einen anderen Zeiger. So können Sie reservieren:
Haben Sie im Auge zu behalten, wo sich Ihre Zeiger gespeichert ist (in diesem Beispiel die doppelten Zeiger auf einen Zeiger-variable auf den stack, so ist es ungültig, nachdem die Funktion zurückkehrt).
InformationsquelleAutor Pent Ploompuu
andere, einfachere Art und Weise auswendig zu lernen
Case -1 :
Schritt-1 : char *p;
Schritt -2 :
bitte Lesen Sie es wie unten
char (*p); ==> p ist ein Zeiger auf ein char
nun müssen Sie nur tun malloc für den Typ (Schritt-2) ohne Klammern
d.h., p = malloc(sizeof(char) * some_len);
Case -2 :
Schritt-1 : char **p;
Schritt -2 :
bitte Lesen Sie es wie unten
char* (* p); ==> p ist ein Zeiger auf eine char *
nun müssen Sie nur tun malloc für den Typ (Schritt-2) ohne Klammern
d.h., p = malloc(sizeof(char *) * some_len);
Case -3 :
Niemand nutzt diese aber nur aus Gründen der Erläuterung
char ***p;
Lesen wie,
char** (*p); ==> p ist ein Zeiger auf eine char* - * (und für diese Prüfung Fall 2 oben)
p = malloc(sizeof(char**) * some_len);
InformationsquelleAutor ravi chandra
kann deine Tippfehler Fehler, aber die Schleife sollte von 50 anstelle von 20, wenn Sie schauen, für 50 x 50-matrix. Auch nach der Zuteilung von Speicher oben erwähnt können Sie den Zugriff auf die Puffer-ptr[i][j] ich.e im 2D-format.
InformationsquelleAutor AnkitSahu
Hinzufügen Pent Antwort, wie er richtig hervorhob, werden Sie nicht in der Lage sein, diese zu verwenden, Doppel-Zeiger, sobald die Funktion zurückkehrt, denn es wird an einen Speicherbereich auf die Funktion " activation-record auf dem stack, der nun obsolet ist (nachdem die Funktion zurückgekehrt ist). Wenn Sie möchten, verwenden Sie diesen Doppel-Zeiger nach der Funktion zurückgegeben hat, können Sie dies tun:
Den Rückgabetyp der Funktion muss offensichtlich sein
char **
.InformationsquelleAutor Rohan Saxena
Doppel-Zeiger ist, einfach ausgedrückt, ein Zeiger auf einen Zeiger,
In vielen Fällen ist es verwendet, als eine Reihe von anderen Arten.
Zum Beispiel, wenn Sie möchten, erstellen Sie ein array von strings, können Sie einfach tun:
diese erstellt ein array der Größe 10, jedes element wird ein string der Länge 40.
damit Sie Zugriff auf diese durch stringArray[5] und erhalten Sie einen string in der 6. position.
dies ist eine Verwendung, die anderen sind wie schon oben erwähnt, ist ein Zeiger auf einen Zeiger, und zugeordnet werden können einfach durch:
Lesen Sie hier mehr:
gutes tutorial array
Was Hans sagt, ist richtig. Noch mehr, die das array von 100 char* mit 0 initialisiert wird, (da Sie verwendet werden, calloc) so, dass alle diejenigen, char* zeigt auf null und den Zugriff auf die array-Position wird einen Fehler verursachen.
InformationsquelleAutor MindFold