Dynamisches Zweidimensionals Array von Zeigern auf Zeigern auf char
-
VF schrieb:
char ***data;
Also, so etwas macht wirklich keinen Sinn, zumindest habe ich solche Kontrukte bisher nicht gebraucht.
Was du brauchst, um eine Tabelle von Strings anzulegen, ist ein Zeiger auf einen Zeiger, nicht mehr. Schau dir einmal das argv-Argument von main(...) an.
Außerdem ist es kein guter Stil, Speicher anzufordern und nicht wieder freizugeben.Hallo VF,
argv ist aber nur eine Liste von Strings. Ich hätte gerne eine Tabelle mit Strings. Also Zeilen und Spalten.
Den Speicher gebe ich nicht frei weil es ein Beispielprogramm fürs Forum ist und der Speicher beim beenden eh freigegeben wird. Ansonsten denk Dir einfach in Zeile 17 ein free(data[f][i]);.
Gruß
Thomas
-
TomZeh schrieb:
und der Speicher beim beenden eh freigegeben wird.
Nein. Er wird sich bestenfalls zurückgeholt, wenn das System verwaisten Speicher sieht, aber er wird nicht von deinem Programm freigegeben.
-
Kein Wunder, dass ich so etwas nicht kenne, derlei Konstrukte würde ich normalerweise niemals in C, nur in C++, verwenden. Dies sollte aber gehen
char*** p; p = (char***) malloc(10); p[0] = (char**)malloc(5); p[0][0] = (char*)malloc(15); strcpy(p[0][0],"Hello World"); printf(p[0][0]); // hier jetzt alles zerstören free(...);
-
Übrigens, ein einfaches Konstrukt à la argv könnte dennoch ausreichen, wenn die einzelnen Spalten bspw. mit einem Komma voneinander getrennt wären.
-
Oh der Schmerz...
-
TomZeh schrieb:
Macht man das so?
Kann man so machen. Verbesserungen sind möglich, aber prinzipiell OK, egal was irgendwelche Leute als "sinnvoll" ansehen oder nicht. Diese Leute haben meist einen beschränkten Horizont bzw. Praxiskenntnis und meinen aus diesem Umfeld heraus anderen irgendwas empfehlen oder vorschreiben zu müssen.
-
Danke Wutz.
-
TomZeh schrieb:
Hallo,
Im Buch C von A-Z steht das Zeiger auf Zeiger auf Zeiger wenig Sinn machen.Bezüglich des Autors siehe auch http://www.c-plusplus.net/forum/viewtopic-var-t-is-272350.html
-
VF schrieb:
Kein Wunder, dass ich so etwas nicht kenne, derlei Konstrukte würde ich normalerweise niemals in C, nur in C++, verwenden. Dies sollte aber gehen
char*** p; p = (char***) malloc(10); p[0] = (char**)malloc(5); p[0][0] = (char*)malloc(15); strcpy(p[0][0],"Hello World"); printf(p[0][0]); // hier jetzt alles zerstören free(...);
da habe ich aber Augenkrebs bekommen, danke
Wenn du schon solche perverse Sachen machen willst, dann bitte richtig, und wenn nicht, dann erspart bitte die Welt mit deinen buggy Programmen.
char*** p; p = malloc(10 * sizeof *p); p[0] = malloc(5 * sizeof **p); p[0][0] = malloc(15 * sizeof ***p); strcpy(p[0][0],"Hello World"); puts(p[0][0]); /* printf(p[0][0]); was wäre, wenn ich gemacht hätte strcpy(p[0][0],"Hello %s World"); ??? */ free(p[0][0]); free(p[0]); free(p);
-
supertux schrieb:
da habe ich aber Augenkrebs bekommen, danke
Wenn du schon solche perverse Sachen machen willst, dann bitte richtig, und wenn nicht, dann erspart bitte die Welt mit deinen buggy Programmen.
char*** p; p = malloc(10 * sizeof *p); if (!p) goto cleanup; // ... cleanup: // whatever you have to cleanup
Tuxi, heut' muß ich Dir auch ein wenig gram sein, kein malloc/realloc ohne check.
@VF Pfeif' Dir das noch rein, nimm's Dir zu Herzen und vergiß' bitte, bitte C von A-Z ganz schnell!