Problem mit dynamischem zweidimensionalen Array

Diskutiere Problem mit dynamischem zweidimensionalen Array im C/C++ Forum im Bereich Programmieren unter Linux/Unix; So, vielleicht 'ne doofe Frage aber ich hab' da ein kleines Problem... Hocke an einem Programm, was einen eingegebenen Text u.a. in seine...

  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. Problem bei der installation einer Sun Netzwerkkarte

    Problem bei der installation einer Sun Netzwerkkarte: Guten Morgen zusammen, beim installieren einer zusätzlichen Netzwerkkarte habe ich ein Problem. Die Karte wird nicht automatisch installiert. Es...
  3. Problem bei der Vergabe von Sciherheitsinformationen auf eine Freiagbe

    Problem bei der Vergabe von Sciherheitsinformationen auf eine Freiagbe: Liebe Community, zurzeit arbeite ich an eine Active Directory Domäne die mittels Samba läuft. Dazu habe ich einen AD DC auf Debian 8.7 mit Samba...
  4. Netzwerkproblem ? , wo ud wie suchen

    Netzwerkproblem ? , wo ud wie suchen: Hallo Folgende Problem: Testserver ist i686 Debian-unstable , auf dem läuft primär der apt-proxy apt-cahcer ng. Zugriff im Moment nur per ssh....
  5. Verständnisproblem Samba / LDAP

    Verständnisproblem Samba / LDAP: Hallo zusammen! Ich habe unter Ubuntu 16.04 einen LDAP und Samba Server aufgesetzt. Diese scheinen auch ordnungsgemäß zu funktionieren, sodaß ich...