Problem mit dynamischem zweidimensionalen Array

Lord Kefir

Lord Kefir

König
So, vielleicht 'ne doofe Frage aber ich hab' da ein kleines Problem...

Hocke an einem Programm, was einen eingegebenen Text u.a. in seine einzelnen Sätze gliedern soll. Das ganze möchte ich mit einem dynamischen zweidimensionalen Array lösen: char **satzfeld.

Ich alloziere zu Beginn den Speicherplatz für 10 Sätze (hab' für spätere Änderungen 'ne Konstante definert: SATZ_BLOCK) und das sieht dann so aus: satzfeld=(char **)malloc(SATZ_BLOCK*4).

Sollte die Größe überschritten werden, wird das Array mit realloc erweitert.

Der Speicherplatz für die Sätze wird - je nach Speicherplatzbedarf - an einer späteren Stelle reserviert: satzfeld=(char *)malloc(der entsprechende Wert)

Ausgeben kann ich die Sätze hinther also so:
for (i=0; i<satz_anzahl; ++i)
printf("%s\n", satzfeld);


Das Problem ist, dass die Sätze nicht immer korrekt gespeichert werden und es 100%ig mit irgendwelchen Speicherüberschreibungen zu tun hat. Ich bin mir nicht ganz sicher, ob es richtig ist, 4*10 Bytes für das Array zu allozieren - aber eigentlich müsste das doch richtig sein, oder? Ist schließlich die Größe eines Zeigers...

Mfg, Lord Kefir


ps: Hab' mal einen Auszug des Codes angehangen...
 

Anhänge

  • auszug.txt
    1,5 KB · Aufrufe: 15
Warum nimmst du nicht einfach den Vector aus der STL? Oder möchtest du auf alle Fälle bei C bleiben?
 
Hmm, ich bin jetzt auch nicht der Oberprogrammierer, aber wo wird bei dir der "\0"-char gesetzt. ansonten ist es wohl vorteilhaft immer satzfeld=(char **)malloc(SATZ_BLOCK*sizeof(char*)) zu schreiben.
 
ich habs nur kurz überflogen und würds aber so machen:
nicht jedes 10. mal sondern jedesmal

Code:
i=0;
satzfeld=(char **)malloc(sizeof(char*));

while(...)
{
...
satzfeld[i]=(char *)malloc(strlen(enzufuegender_satz)*sizeof(char));
....
if (!ende)
    satzfeld=(char **)realloc(satzfeld,++i*sizeof(char*));
...
}

so ungefähr. dein problem ist glaube ich das du immer mit 4 multiplizierst meim allocieren und nicht beim siezof(..)
bin mir nicht sicher aber char* und char sind glaube ich nicht beide 4 groß.

wie auch immer, so wie oben sollte es funktionieren
 
Ähm, hab' den post ganz vergessen gehabt... aber danke für die Antworten.

@manthano:
Danke für den Tipp, aber ich wollte bei reinem C bleiben.

@h2owasser:
Ne, dass war nicht das Problem.

@cremi:
Ich wollte eigentlich aus Performancegründen nicht für jedes neue Element die Arraygröße ändern. char-Zeiger sind übrigens 4 Byte groß - ich wusste nur nicht mehr genau, ob ich die Größe eines Zeigers mit strlen() ermitteln kann. Jetzt mache ich es jedenfalls so.


Was jetzt genau der Fehler war weiß ich auch nicht mehr - war jedenfalls irgendein blöder Zahlendreher... wie immer ;)

Mfg, Lord Kefir
 
Ach ne... falls mal jemand ein ähnliches Problem haben sollte... ich errinnere mich gerade, was ich geändert habe:

Ich hab' mal so zum Test die entsprechende Variable für den Satz (also satzfeld) mit memset(satzfeld, 0, größe) initialisert und danach waren alle Ausgaben in Ordnung. Hab' das ganze mit einem 5000 Byte großen String getestet und es sah alles korrekt aus.

Mfg, Lord Kefir
 

Ähnliche Themen

Xubuntu - AVR32-linux crosscompile sqlite

Programm start mit null oder einem parameter und ein paar zahlen

OpenGL Programm für Windows unter Linux kompilieren?

Suse linux 10.1 Dvd nicht erkannt/keine Netzwerkkarte

Server-Monitoring mit RRDTool

Zurück
Oben