speicher fehler bei free



  • hallo leutz,

    ich bekomme hier immer einen speicherzugriffsfehler.
    (vc++6.0 win2k)
    wenn ich das free weglasse geht alles normal.

    int main(int argc, char* argv[]){
    
    int anzahl=(atoi(argv[1]));
    int *array=(int *) malloc(anzahl*sizeof(int));
    
        for(int i=0;i<anzahl;i++){
            array[i]=rand();
        }   
    
        for( i=0;i<anzahl;i++){
            cout<< " "<<array[i];
        }   
    
        cout<<endl;
        cout<<"----------------------------"<<endl;
    
        quicksort(array,0,anzahl);
    
        for( i=0;i<anzahl;i++){
            cout<< " "<<array[i];
        }   
    
        cout<<endl;
    
        free(array);
        return 0;
    
    }
    


  • du mischt C und C++, das ist nicht gut.

    der fehler liegt wahrscheinlich in quicksort()



  • wieso im quicksort ???

    wenn ich free weglasse, geht alles so wie es gehen soll.

    auch wenn ich for free ein Sleep(langezeit) einfüge bekomme ich auch einen fehler.



  • Weil vielleicht in Quicksort() eine Anweisung fehlerhaft ist und einen Speicherbereich überschreibt und deshalb free() den Speicherblock nicht mehr richtig freigeben kann. Zeig uns doch mal den ganzen Code.



  • void quicksort1 (int a[], int l, int r) {
    
        int v, i, j, t;
    
        if (r>l) {
        v = a[r]; i = l-1; j = r; // wähle letztes Elem. als Schnittelem.
    
            for (;;) {
            while (a[++i] < v && i <= r); // i hochzählen, bis Schlüssel zu gross
            while (a[--j] > v && j >= l); // j runterzählen, bis Schlüssel zu klein
            if (i >= j) break; // keine Schlüssel mehr zu vertauschen
            t = a[i]; a[i] = a[j]; a[j] = t; // Vertauschung
            }
    
            t = a[i]; a[i] = a[r]; a[r] = t; // Schlüssel an richtige Stelle
            quicksort1 (a,l,i-1);
            quicksort1 (a,i+1,r);
        }
    }
    
    int main(int argc, char* argv[]){
    
    int anzahl=(atoi(argv[1]));
    
    int *array=(int *) malloc(anzahl*sizeof(int));
    
        for(int i=0;i<anzahl;i++){
            array[i]=rand();
        }   
    
        /*for( i=0;i<anzahl;i++){
            cout<< " "<<array[i];
        }*/ 
    
        cout<<endl;
        cout<<"----------------------------"<<endl;
    
        quicksort1(array,0,anzahl);
    
    /*  for( i=0;i<anzahl;i++){
            cout<< " "<<array[i];
        }   */
    
        cout<<endl;
    
        free(array);
        return 0;
    
    }
    


  • Du gibtst als Rechte grenze anzahl an, damit liest du als Schnittelement einen int hinter dem Array (ein Array der Größe anzahl hat die Elemente a[0]..a[anzahl-1]).



  • danke, stimmt.


Anmelden zum Antworten