Dyn. Stringvektor wieder freigeben
-
Du hast immernoch sizeof(char) in Zeile 18, daher kannst du in PtrNamPtrArr nicht 4 Strings speichern wie du eigentlich willst, sondern nur einen.
-
deshalb sollte man
sizeof(datatype)
nicht verwenden, weil es zu Fehlern führt.PtrNamPtrArr = calloc(NamAnz, sizeof *PtrNamPtrArr));
da spielt überhaupt keine Rolle, was für ein Datentyp PtrNamPtrArr hat, das reserviert stets die benötigte Anzahl an Bytes. Siehe http://www.c-plusplus.net/forum/viewtopic.php?t=206606
btw.
fflush(stdin);
kann die CPU zum Schmelzen bringen.PS: wieso kompilierst du C Code mit einem C++ Compiler??? Entweder C schreiben, oder C++ aber nicht beides zusammen. Das führt zu Katastrophen.
-
PtrNamPtrArr = (char **)calloc(NamAnz, sizeof(char*));
ist doch logisch das gleiche wie:
PtrNamPtrArr = (char **)malloc(NamAnz*sizeof(char*));
und funzt auch nicht
@supertux
genauso wenig wie:PtrNamPtrArr = calloc(NamAnz, sizeof (*PtrNamPtrArr));
Ich hatte beide Vorschläge mit meiner Zeile 18. ersetzt doch die Fehlermeldung
während des ausführens ist gebliebenPS: wieso kompilierst du C Code mit einem C++ Compiler??? Entweder C schreiben, oder C++ aber nicht beides zusammen. Das führt zu Katastrophen.
Ist Vorschrift so, wahrscheinlich weil wir nächstes Semester auf c++ umsteigen werden ka
-
Johann2 schrieb:
...
len = strlen(buf)-1; /* Stringlaenge feststellen */
...^^ diese -1 sieht verdächtig danach nach fehler aus. mach mal lieber +1 daraus.
-
Bis eben stand da noch sizeof(char).
Ich habe keine Ahnung was du hast, ich habe den Code kompiliert und er läuft.
C und C++ mischen bzw. C mit einem C++-Compiler übersetzen und die wenigen Annehmlichkeiten von C++ genießen klappt super und endet nicht in einer Katastrophe.
-
nwp2 schrieb:
C und C++ mischen bzw. C mit einem C++-Compiler übersetzen und die wenigen Annehmlichkeiten von C++ genießen klappt super und endet nicht in einer Katastrophe.
die katastrophe haste spätestens dann, wenn du so'nen hingepfuschten C und C++ mischmach mit einem anderen compiler zum laufen kriegen willst.
-
nwp2 schrieb:
...ich habe den Code kompiliert und er läuft.
das zeigt doch nur, dass fehlerhafter code compilieren und manchmal sogar noch funktionieren kann. die 'strcpy's zerbröseln ihm den heap, jedes folgend 'malloc' oder 'free' könnte sich recht seltsam verhalten.
-
Ich habe keine Ahnung was du hast, ich habe den Code kompiliert und er läuft.
Bei mir tat er es aber nicht.
// dynStrVektor.cpp: mein Prog, nur stark komprimiert. #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXNAMLEN 51 /* Maximale Laenge inkl. \0 */ int main(void) { char ** PtrNamPtrArr = NULL, /* dyn. Stringvektor fuer Namen */ buf[MAXNAMLEN]; /* Einlesepuffer fuer einen Namen */ int iAktNam, /* Laufindex fuer jeden Namen */ len, /* Laenge eines Namens */ NamAnz = 4; /* fuer geforderte Namensanzahl */ /* Platz fuer NamAnz dyn. Strings reservieren */ PtrNamPtrArr = (char **)calloc(NamAnz, sizeof(char*)); for( iAktNam = 0; iAktNam < NamAnz; iAktNam++ ) { printf("Name %2d: ", iAktNam+1); fgets( buf, MAXNAMLEN, stdin); /* einen Namen einlesen */ len = strlen(buf); /* Stringlaenge feststellen */ buf[len-1] = '\0'; /* letzes Zeichen loeschen */ fflush(stdin); /* ggf. Puffer leeren */ printf("buf ist : %s und laenge ist: %d",buf,len); /* Speicher feur akt. Namen im Heap reservieren */ PtrNamPtrArr[iAktNam] = (char *)calloc(len, sizeof(char)); /* Namen aus dem Einlesepuffer in den Heap kopieren */ strcpy(PtrNamPtrArr[iAktNam], buf); } /* Speicher wieder freigeben klappt nicht */ for(iAktNam = 0; iAktNam < NamAnz; iAktNam++) free( PtrNamPtrArr[iAktNam] ); free(PtrNamPtrArr); printf("\n\n weiter mit [return]:"); setvbuf(stdin,NULL,_IONBF,0); setvbuf(stdin,NULL,_IOFBF,BUFSIZ); getchar(); return 0; }
Durch das
len = strlen(buf)-1;
was ich vorher in Zeile 25. stehen hatte wurde ja nur die Länge der sichtbaren Zeichen ermittelt. Anschließend mit
PtrNamPtrArr[iAktNam] = (char *)calloc(len, sizeof(char));
dementsprechend auch nur für einen String mit sichtbarer Zeichenanzahl reserviert. Dass '\0' hatte dann im Heap keinen Platz mehr gefunden.
Habe das -1 jetzt eine Zeile nach unten verfrachtet und es läuft jetzt.
Danke für dir HilfeGruß
Johann
-
Johann2 schrieb:
Habe das -1 jetzt eine Zeile nach unten verfrachtet und es läuft jetzt.
wird zufall sein. ich denke, ein -1 hat da nichts verloren, eher schon +irgendwas.
-
Klar, das
buf[len-1] = '\0';
löscht das '\n' das brauch ich nicht mit abspeichern