Problem mit dynamischem zweidimensionalen Array

Dieses Thema im Forum "C/C++" wurde erstellt von Lord Kefir, 12.01.2005.

  1. #1 Lord Kefir, 12.01.2005
    Lord Kefir

    Lord Kefir König

    Dabei seit:
    10.06.2004
    Beiträge:
    944
    Zustimmungen:
    0
    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:

  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 manthano, 12.01.2005
    manthano

    manthano Tripel-As

    Dabei seit:
    22.11.2004
    Beiträge:
    175
    Zustimmungen:
    0
    Ort:
    Berlin
    Warum nimmst du nicht einfach den Vector aus der STL? Oder möchtest du auf alle Fälle bei C bleiben?
     
  4. #3 h2owasser, 12.01.2005
    h2owasser

    h2owasser Sxe Power User

    Dabei seit:
    07.12.2002
    Beiträge:
    491
    Zustimmungen:
    0
    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.
     
  5. cremi

    cremi Dude

    Dabei seit:
    15.02.2004
    Beiträge:
    329
    Zustimmungen:
    0
    Ort:
    AUT/Ktn
    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
     
  6. #5 Lord Kefir, 17.01.2005
    Lord Kefir

    Lord Kefir König

    Dabei seit:
    10.06.2004
    Beiträge:
    944
    Zustimmungen:
    0
    Ä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
     
  7. #6 Lord Kefir, 17.01.2005
    Lord Kefir

    Lord Kefir König

    Dabei seit:
    10.06.2004
    Beiträge:
    944
    Zustimmungen:
    0
    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
     
  8. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
Thema:

Problem mit dynamischem zweidimensionalen Array

Die Seite wird geladen...

Problem mit dynamischem zweidimensionalen Array - Ähnliche Themen

  1. Problem mit dynamischem DNS /DHCP

    Problem mit dynamischem DNS /DHCP: Hallo, mal wieder ein Problem - diesmal mit DynDNS und DHCP. Ich habe auf einem Server versucht den dhcpd und den named zu konfigurieren. Dabei...
  2. Virtualboxproblem

    Virtualboxproblem: Hallo Folgnedes Problem: Ich kann ohne Probleme In Debian-Sid, 64Bit und virtualbox-dkms Unixoide installieren, wenn es sich um eine...
  3. grub-pc Probleme bei upgrade

    grub-pc Probleme bei upgrade: Hallo, ich habe beim dist-upgrade folgendes Problem: ---------- Nach dieser Operation werden 0 B Plattenplatz zusätzlich benutzt. Trigger für...
  4. Problem bei apt-get upgrade (Kali 2.0)

    Problem bei apt-get upgrade (Kali 2.0): Hi, seit paar Tagen habe ich einige Probs. Dachte es sei mal an der Zeit für ein Update und nun tauchen da einige Fehler auf: Es müssen noch 0 B...
  5. Probleme mit YUM

    Probleme mit YUM: Hallo, ich habe CentOs 7 als Dualboot mit Windows 7 auf einen Dell Latitude E5510 installiert. Dies hat soweit auch alles geklappt. Leider habe...