string Wert auf char* Array
-
Dir fehlt noch Speicher. Du benutzt strcpy(pStringField[i],str);, aber in pStringField[i] ist garkein Speicher reserviert. Du musst noch ein pStringField[i] = malloc(100); oder so hinzufügen.
-
nwp2 schrieb:
Dir fehlt noch Speicher. Du benutzt strcpy(pStringField[i],str);, aber in pStringField[i] ist garkein Speicher reserviert. Du musst noch ein pStringField[i] = malloc(100); oder so hinzufügen.
super toll, das funktioniert jetzt wunderbar.
Das heißt jetzt quasi hier:
char **pStringField = malloc(sizeof *pStringField * n)
wird nur der Speicher für das eigentliche Feld reserviert, nicht aber für die einzelnen Elemente richtig?
Wenn das so ist frage ich mich nur warum das dann für die ersten 2 Aufrufe überhaupt geklappt hat?!
Jedenfalls vielen Dank!
-
Yup, so ist es.
Speicher wird Seitenweise reserviert, eine Seite hat meist 4kb. Das heißt du kannst mit Glück bis zu 4095 Bytes hinter dem Speicherbereich schreiben. Wenn die nächste Seite auch reserviert ist auch noch weiter. Oder du kriegst schon beim ersten nicht reservierten Byte einen Segmentation Fault wenn dieses Byte zufällig auf einer neuen nicht reservierten Seite liegt.
-
KnufflPuffl schrieb:
Das heißt jetzt quasi hier:
char **pStringField = malloc(sizeof *pStringField * n)
wird nur der Speicher für das eigentliche Feld reserviert, nicht aber für die einzelnen Elemente richtig?
Du reservierst:
n == 1: Speicher für einen Zeiger auf ein Array(Feld),
n > 1: Speicher für n Zeiger auf n Arrays(Felder).
Den Speicher für die 'eigentlichen' Felder reservierst du erst innerhalb der for Schleife.KnufflPuffl schrieb:
Wenn das so ist frage ich mich nur warum das dann für die ersten 2 Aufrufe überhaupt geklappt hat?!
Weil in den ersten 2 Aufrufen keine Speicherschutzverletzung eingetreten ist.
-
nwp2 schrieb:
Speicher wird Seitenweise reserviert, eine Seite hat meist 4kb.
Aber doch nicht mit malloc
char* a, *b; a = malloc (1); b = malloc (1); printf("%d\n", b-a); // Differenz == 4kb? :confused: return 0;
-
nwp2 schrieb:
Yup, so ist es.
Speicher wird Seitenweise reserviert, eine Seite hat meist 4kb. Das heißt du kannst mit Glück bis zu 4095 Bytes hinter dem Speicherbereich schreiben. Wenn die nächste Seite auch reserviert ist auch noch weiter. Oder du kriegst schon beim ersten nicht reservierten Byte einen Segmentation Fault wenn dieses Byte zufällig auf einer neuen nicht reservierten Seite liegt.
Achso ist das, sprich das war nur Glück ^^
Jedenfalls vielen Dank an alle die mir geholfen haben, echt super!
Eine allerletzte Frage hätte ich noch (sry intressiert mich nur sehr) also malloc() zählt ja zur dynamischen Speicherverwaltung richtig? sprich der Speicher wird im heap reserviert. Muss ich in diesem Fall, nicht den Speicher auch manuell wieder freigeben? (sonst bleibt der Speicher ja blockiert oder? -> weiß nur dass es in c++ so mit new und delete ist).
Tut mir leid falls ich schon nerve ^^
-
KnufflPuffl schrieb:
nwp2 schrieb:
Yup, so ist es.
Speicher wird Seitenweise reserviert, eine Seite hat meist 4kb. Das heißt du kannst mit Glück bis zu 4095 Bytes hinter dem Speicherbereich schreiben. Wenn die nächste Seite auch reserviert ist auch noch weiter. Oder du kriegst schon beim ersten nicht reservierten Byte einen Segmentation Fault wenn dieses Byte zufällig auf einer neuen nicht reservierten Seite liegt.
Achso ist das, sprich das war nur Glück ^^
Jedenfalls vielen Dank an alle die mir geholfen haben, echt super!
Eine allerletzte Frage hätte ich noch (sry intressiert mich nur sehr) also malloc() zählt ja zur dynamischen Speicherverwaltung richtig? sprich der Speicher wird im heap reserviert. Muss ich in diesem Fall, nicht den Speicher auch manuell wieder freigeben? (sonst bleibt der Speicher ja blockiert oder? -> weiß nur dass es in c++ so mit new und delete ist).
Tut mir leid falls ich schon nerve ^^
Ok hat sich schon erledigt, hab grad gegoogelt wegen dynamischer speicherverwaltung.. geht ja mit free(..)..
Dann bleibt mir nur noch übrig euch allen ganz herzlich zu danken!
-
KnufflPuffl schrieb:
Eine allerletzte Frage hätte ich noch (sry intressiert mich nur sehr) also malloc() zählt ja zur dynamischen Speicherverwaltung richtig? sprich der Speicher wird im heap reserviert. Muss ich in diesem Fall, nicht den Speicher auch manuell wieder freigeben? (sonst bleibt der Speicher ja blockiert oder? -> weiß nur dass es in c++ so mit new und delete ist).
Genau so ist es. Für jedes malloc muss ein free aufgerufen werden:
for(i=0; i < n; i++) { free(pStringField[i]); // Zeilen löschen } free (pStringField); // Zeiger auf Zeilen löschen.
-
jap habe ich jetzt genauso implementiert.
Nochmals danke!
Btw: muss ich den Thread hier irwie als beantwortet markieren oder so?
-
KnufflPuffl schrieb:
Btw: muss ich den Thread hier irwie als beantwortet markieren oder so?
Nööö.