realloc eines 2-dimensionalen char array
-
ich möchte Wörter aus einer Datei einlesen und diese in einem Array abspeichern. Da ich nicht weiß wieviele vorbei kommen werden, soll das Array sich dynamisch vergrößern. Wo liegt der Fehler?
szStopwords = (char**) malloc(INCREMENT_STOPWORDLIST * sizeof(char*)); for (i=0; i<INCREMENT_STOPWORDLIST; i++) { szStopwords[i] = (char*) malloc (MAX_STOP_WORD_LENGHT * sizeof(char)); } //read stopwords iNrStopWords = 0; iReallocs = 1; while (fgets(szStopwords[iNrStopWords], MAX_STOP_WORD_LENGHT, fStopWords) != NULL) { iNrStopWords++; if (iNrStopWords == INCREMENT_STOPWORDLIST * iReallocs) { //realloc enough size iReallocs++; szStopwords = (char**) realloc(szStopwords, iReallocs * sizeof (szStopwords) * sizeof(char)); for (i=iNrStopWords; i<iNrStopWords+INCREMENT_STOPWORDLIST; i++) { szStopwords[i] = (char*) malloc (MAX_STOP_WORD_LENGHT * sizeof(char)); } } }
INCREMENT_STOPWORDLIST ist die Anzahl der Einträge, um die das Array erweitert werden soll.
Ich bekomme eine Access Violation beim realloc.
-
ich weiss nicht ob's daran liegt, aber bei 'realloc' darfste dir keine pointer in den speicher merken, weil meistens alles verschoben wird. ...und beachte auch die rückgabewerte von 'malloc' und 'realloc' (dürfen nicht 0 sein)
-
Hallo net,
was meinst du mit
net schrieb:
... bei 'realloc' darfste dir keine pointer in den speicher merken, weil meistens alles verschoben wird.
realloc gibt mir doch die neue Adresse zurück, die ich mir in der selben Variablen merken kann, oder?
-
paddy321 schrieb:
was meinst du mit
net schrieb:
... bei 'realloc' darfste dir keine pointer in den speicher merken, weil meistens alles verschoben wird.
realloc gibt mir doch die neue Adresse zurück, die ich mir in der selben Variablen merken kann, oder?
ja, das schon, aber sowas
char *p = malloc(irgendwas); char *q = p+1; p = realloc (p, irgendwas+nochwas);
q ist dann in 99.9% aller fälle ungültig, weil realloc nicht einfach was anhängt, sondern einen neuen heap-block reserviert, alles rüberkopiert und den alten freigibt.
btw: aber wie's aussieht, ist das wohl nicht das problem bei deinem code.
-
net schrieb:
q ist dann in 99.9% aller fälle ungültig, weil realloc nicht einfach was anhängt, sondern einen neuen heap-block reserviert, alles rüberkopiert und den alten freigibt.
btw: aber wie's aussieht, ist das wohl nicht das problem bei deinem code.Ok, jetzt weiß ich was du meinst, aber ich denke auch, das das nicht das Problem ist, da ich keine Referenz einer anderen Variablen auf szStopwords setze.
Was mich auch wundert, ich habe im Netz keine Beispiele für meinen Fall gefunden!?!? Es müßte dafür doch eigentlich zahlreiche Beispiele geben, oder?
Eine andere Frage: Mir gefällt das Forum und ich würde gerne aktiv dran teilnehmen, aber wenn ich bei der ersten Seite der Regestrierung auf "Annehmen" clicke, bleibt die nächste Seite weiss...
-
*KOTZ* wieso benutzen alle realloc falsch?
char *p = malloc(irgendwas); char *q = p+1; p = realloc (p, irgendwas+nochwas);
ich meine p = realloc (p, irgendwas+nochwas); das ist schlecht, weil wenn realloc NULL zurückliefert, dann ist der Pointer in p verloren und man kan eventuell nicht mehr den Speicher freigeben
richtig wärechar* tmp; char *p = malloc(irgendwas); if(!p) DO_FEHLER_BEHANDLUNG tmp = realloc(p, irgendwas+nochwas+1); if(!tmp) DO_FEHLER_BEHANDLUNG if(tmp != p) p = tmp;
-
supertux schrieb:
ich meine p = realloc (p, irgendwas+nochwas); das ist schlecht, weil wenn realloc NULL zurückliefert, dann ist der Pointer in p verloren und man kan eventuell nicht mehr den Speicher freigeben
das ist richtig. schlimmer noch: wenn es der einzige pointer war den man hatte, dann ist der jetzt NULL und man kann noch nicht mal mehr auf seine daten zugreifen (realloc gibt NULL zurück, hat aber den alten heap-block nicht ge'freed'). überall nur fallstricke