Speicherzugriffsfehler bei Speicherzuordnung eines 2d arrays



  • @matze

    muss man die Spalten dann auch nicht wieder freigeben, muss also nich zu jedem calloc ein free vorhanden sein?



  • _matze schrieb:

    EDIT: Ja, dein Array lässt sich problemlos nutzen:

    Aber der Speicher lässt sich nicht problemlos freigeben, jedefalls nicht so 😉



  • free0r schrieb:

    _matze schrieb:

    EDIT: Ja, dein Array lässt sich problemlos nutzen:

    Aber der Speicher lässt sich nicht problemlos freigeben, jedefalls nicht so

    und casten soll man den rückgabewert von 'calloc' auch nicht.
    🙂



  • Ja, ihr habt natürlich Recht...

    for(int i = 0; i < Zeilen; i++){
    	free(csv_array[i]);
    }
    free(csv_array);
    


  • ;fricky schrieb:

    und casten soll man den rückgabewert von 'calloc' auch nicht.
    🙂

    jah!



  • ;fricky schrieb:

    free0r schrieb:

    _matze schrieb:

    EDIT: Ja, dein Array lässt sich problemlos nutzen:

    Aber der Speicher lässt sich nicht problemlos freigeben, jedefalls nicht so

    und casten soll man den rückgabewert von 'calloc' auch nicht.
    🙂

    Ich darf, ich hab nen C++-Compiler benutzt! 😃 Fragt sich nur, ob das bei lin123 auch so ist...



  • _matze schrieb:

    Ja, ihr habt natürlich Recht...

    und ausserdem sollteste besser testen, ob 'calloc' erfolgreich war.
    🙂



  • ;fricky schrieb:

    _matze schrieb:

    Ja, ihr habt natürlich Recht...

    und ausserdem sollteste besser testen, ob 'calloc' erfolgreich war.
    🙂

    Na klar, jetzt werde ich auseinandergepflückt! 😃 Ich habe doch nur den Code getestet, ich habe sonst nix daran getan... Recht haste trotzdem, ja ja...



  • ich verwende den Gnu C compiler auf linux!
    vielleicht erklärt das Einiges...

    Mit dem Vorschlag von _matze kommt es genauso so zu dem Speicherzugriffsfehler, allerdings kommt er nachdem alle Werte ausgegeben wurden. Das folgende printf Kommando wird nicht ausgeführt.



  • _matze schrieb:

    ;fricky schrieb:

    _matze schrieb:

    Ja, ihr habt natürlich Recht...

    und ausserdem sollteste besser testen, ob 'calloc' erfolgreich war.
    🙂

    Na klar, jetzt werde ich auseinandergepflückt! 😃 Ich habe doch nur den Code getestet, ich habe sonst nix daran getan... Recht haste trotzdem, ja ja

    jaja, hast dir wohl durch c++ zu viel schlechtes angewöhnt, daher sei dir verziehen.
    🙂



  • lin123 schrieb:

    Mit dem Vorschlag von _matze kommt es genauso so zu dem Speicherzugriffsfehler, allerdings kommt er nachdem alle Werte ausgegeben wurden. Das folgende printf Kommando wird nicht ausgeführt.

    Das liegt aber nicht an _matzes Vorschlag, sondern du hast vermutlich an einer anderen Stelle im Code nen Fehler.



  • ^^ die 'store_csv' ist vermutlich die ursache.
    🙂



  • ;fricky schrieb:

    ^^ die 'store_csv' ist vermutlich die ursache.
    🙂

    aber warum wird das Printf-Kommando vor dem Aufruf von store_csv() nicht ausgeführt?
    Der speicherzugriffsfehler kommt vor dem Aufruf des printf Kommandos.



  • lin123 schrieb:

    ;fricky schrieb:

    ^^ die 'store_csv' ist vermutlich die ursache.
    🙂

    aber warum wird das Printf-Kommando vor dem Aufruf von store_csv() nicht ausgeführt?
    Der speicherzugriffsfehler kommt vor dem Aufruf des printf Kommandos.

    Das glaub ich sowieso nicht. Setz doch mal einen Breakpoint und geh Zeile für Zeile durch.



  • lin123 schrieb:

    aber warum wird das Printf-Kommando vor dem Aufruf von store_csv() nicht ausgeführt?
    Der speicherzugriffsfehler kommt vor dem Aufruf des printf Kommandos.

    dann zeig doch mal ganzen code, der bei dir abkackt.
    🙂



  • "printf-Debugging" ist sowieso nicht so optimal. Dann lieber den Debugger zum Debuggen nutzen. Breakpoint setzen, schrittweise durchgehen, Werte und Ablauf überprüfen...



  • ;fricky schrieb:

    lin123 schrieb:

    aber warum wird das Printf-Kommando vor dem Aufruf von store_csv() nicht ausgeführt?
    Der speicherzugriffsfehler kommt vor dem Aufruf des printf Kommandos.

    dann zeig doch mal ganzen code, der bei dir abkackt.
    🙂

    der ist ziemlich lang!!
    hier ist der Teil der noch nicht geht:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    
    #include <termios.h>
    #include <unistd.h>
    #include <memory.h>
    
    ...
    
    void check_csv (int *check, char *dateiname){
    ...
    }
    
    void store_csv (int **csv_array, char *dateiname){
    FILE * pFile;                          
    pFile=fopen (dateiname,"r");           
    
    int zeile = 0;                         
    int spalte = 0;                        
    char * buffer;                         
    int c=0;                               
    int n=0;                               
    float wert1=0;                         
    int wert2=0;                           
    while(c!='\n'){                        
    	c = fgetc (pFile);                   
    	n++;                                 
    }                                      
    rewind(pFile);                         
    char line[n];                          
    while (getline (pFile, line))          
    {                                      
    	buffer = strtok (line,",");          
    	while (buffer != NULL)               
    	{                                    
    		wert1 = (float)*buffer;            
    		wert1 = wert1*100;                 
    		wert2 = (int)wert1;                
    		csv_array[zeile][spalte] = wert2;  
    		spalte++;                          
    	}                                    
    	zeile++;                             
    }                                      
    }
    
    int main (){
    
    ...
    
    char* dateiname="stuetze.csv";
    int check[3]={0,0,0};
    
    check_csv (check, dateiname);
    
    int Zeilen, Spalten;
    Zeilen = check[0];
    Spalten = check[1]*check[2];
    
    printf ("\narray wird initialisiert ");
    
    static int **csv_array = NULL;
    printf ("\n		allocate memory");              
    csv_array = (int **)calloc(Zeilen,sizeof(int*));
    printf ("\n		test");
    for(i = 0; i < Zeilen; i++)
    	csv_array[i] = (int*)calloc(Spalten,sizeof(int));
    printf ("\nAufruf store_csv ");
    
    store_csv (csv_array, dateiname);
    
    ....
    
    }
    

    Der inhalt der funktion store_csv ist ein noch nicht verprobter Versuch. Zu der Verprobung bin ich noch nicht gekommen weil meiner meinung nach der Programm schon bei der Speicherzuordnung abstürzt...



  • Dann überprüf mal, ob zeile oder spalte in der Funktion store_csv den gültigen Bereich verlassen. Darauf wird es wohl hinauslaufen. Übrigens, wozu brauchst ddu 'wert2'? Die kannst du dir sparen.



  • lin123 schrieb:

    Der inhalt der funktion store_csv ist ein noch nicht verprobter Versuch. Zu der Verprobung bin ich noch nicht gekommen weil meiner meinung nach der Programm schon bei der Speicherzuordnung abstürzt...

    Hast du das denn mittels Debugger (nix printf!) validiert?



  • lin123 schrieb:

    Der inhalt der funktion store_csv ist ein noch nicht verprobter Versuch. Zu der Verprobung bin ich noch nicht gekommen weil meiner meinung nach der Programm schon bei der Speicherzuordnung abstürzt...

    Sind aber viele langjährig erprobte und bewährte Absturzfehler drin. Und auch ein paar sinnlose Konstrukte.
    Was die Speicherzuordnung betrifft: in 0 Byte Speicher gehen exakt 0 Byte Daten rein.


Anmelden zum Antworten