speicher freigeben zweidimensionales array



  • hi,

    ich lese in meinem programm die anzahl der gewünschten strings ein die
    ich einlesen will. dafür fordere ich speicher für die zeilen an.

    in der for schleife wird dann der speicher für die spalten angefordert, bis
    zu \n.

    das ganze funktioniert auch soweit. jedoch bekomme ich in der letzten zeile
    wo ich den speicher freigebe die meldung:

    Unbehandelte Ausnahme bei 0x55767DDE (msvcr110d.dll) in test.exe: 0xC0000005:
    Zugriffsverletzung beim Lesen an Position 0xAB

    Kann mir vl jemand sagen was ich falsch mache?

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int string_cnt = 0;
        char ** matrix;
        int i = 0;
        int a = 0;
    
        printf("How many strings du you wish to read?\n");
        scanf("%d",&string_cnt);
    
        matrix = (char**)malloc(sizeof(char)*string_cnt);
    
        fflush(stdin);
    
        for(i;i < string_cnt;i++)
        {
            int x = 0;
            printf("Please input a string %d: ",i);
            matrix[i] = (char*)malloc(sizeof(char));
    
            while((matrix[i][x] = getchar()) != '\n')
            {
                matrix[i] = (char*)realloc(matrix[i],sizeof(char)*(x+2));
                x++;
            }
        }
    
        for(a=string_cnt; a > 0; a--)
        {
            free(matrix[string_cnt]);
        }
        free(matrix);
    
        return 0;
    
    }
    


  • for(a=(string_cnt-1); a >= 0; a--)
    

    funktioniert es jetzt?



  • verbesserung schrieb:

    for(a=(string_cnt-1); a >= 0; a--)
    

    funktioniert es jetzt?

    quatsch! da hab ich grad nciht mitgedacht!

    die ganze free-schleife muss heißen:

    for(a=(string_cnt-1); a >= 0; a--)
    {
         free(matrix[a]);
    }
    

    ich hoff das geht jetzt.



  • geht leider noch immer nicht 😞

    das fehler tritt dann immer bei free(matrix) auf.
    k.a. was da nicht passen könnte. geb den speicher
    meiner meinung ja richtig frei.



  • nach deiner vorgeschlagenen änderung hat sich aber die fehlermeldung geändert:

    jetzt bekomme ich ein:

    test.exe hat einen Haltepunkt ausgelöst.



  • Die Größenberechnung beim malloc für matrix ist auch falsch.
    Du willst in matrix ja nicht char ablegen sondern char* .



  • matrix = (char**)malloc(sizeof(char)*string_cnt); /* muss sizeof(char*) heißen */
    
        fflush(stdin); /* Anfängerschrott */
    
        for(i;i < string_cnt;i++)
        {
            int x = 0;
            printf("Please input a string %d: ",i);
            matrix[i] = (char*)malloc(sizeof(char)); /* Cast-Schrott */
    
            while((matrix[i][x] = getchar()) != '\n')
            {
                matrix[i] = (char*)realloc(matrix[i],sizeof(char)*(x+2)); /* per se inperformant */
                x++;
            }
        }
    
        for(a=string_cnt; a > 0; a--) /* startet/endet zu früh: for(a=string_cnt-1; a >= 0; a--)*/
    


  • Ach noch was:
    sizeof(char) ist per Default 1. Kannst du also gleich 1 hin schreiben.
    sizeof(char*) ist Systemabhängig.



  • matrix = (char**)malloc(sizeof(char)*string_cnt); /* muss sizeof(char*) heißen */
    

    stimmt und ich such da ewig herum. danke 🙂

    fflush(stdin); /* Anfängerschrott */
    

    ja weiss ich. habs nur halt mit visual studio gemacht zum testen. was mich interessieren würde
    is aber wie man sonst am schnellsten den puffer leer bekommt? gibts da eine andere funktion?

    matrix[i] = (char*)malloc(sizeof(char)); /* Cast-Schrott */
    

    was passt hier genau nicht?

    matrix[i] = (char*)realloc(matrix[i],sizeof(char)*(x+2)); /* per se inperformant */
    

    und hier? irgendwie muss ich die größe ja angeben.



  • du musst hier nichts casten.
    statt

    matrix[i] = (char*)malloc(sizeof(char));
    

    einfach

    matrix[i] = malloc(sizeof(char)); /* ohne (char *) */
    

    das gilt auch für alle anderen mit malloc allokierten speicher. du musst den allokierten speicher -nicht- casten.

    warum willst du den puffer leeren? das brauchst du nicht. eigentlich braucht man dieses unsägliche "fflush" so gut wie nie.



  • du musst hier nichts casten.

    ja schon aber wenn ich nicht caste bekomm ich unter visual studio
    eine error meldung.


  • Mod

    xxmaxx schrieb:

    du musst hier nichts casten.

    ja schon aber wenn ich nicht caste bekomm ich unter visual studio
    eine error meldung.

    Dann benutzt du einen C++-Compiler. Benutze einen C-Compiler für C. Der Standardcompiler vom Visual Studio hat auch einen C(89) Modus.



  • ok alles klar. vielen dank für die hilfe 🙂



  • wenn du nur c programmieren willst, dann kannst du auch einen einfachen c-compiler benutzen.

    ich empfehle den standard-compiler aller linux-systeme: den gcc.

    für windows http://mingw.org/

    man braucht unter windows keinen schei.. von ms.


Anmelden zum Antworten