Segmentation Fault



  • Hallo zusammen,

    folgende Funktion läuft unter Linux (gcc 4.3.2) , und auf einem Windows (gcc 4.3.4) wird ein Segmentation fault geworfen.

    void function (int *data1, int *data2){
    int *ptr1, *ptr2;
    ptr1 = data1;
    ptr2 = data2;
    
    //bis hierhin fehlerfrei und in der for-Schleife wird die exception geworfen)
    for (int i= 0; i<1000;i++){
       *ptr1++ = 0;
       *ptr2++ = 0;
    }
    
    ...
    }
    

    Jemand eine Idee?

    Danke



  • Wie wird denn die Funktion aufgrufen? Und wieviel Platz hast du hinter den Zeigern/Arrays bereitgestellt, die du als Parameter übergibst?

    Wahrscheinlichste Ursache ist es, daß hinter den Parametern zu wenig Platz ist und du deshalb in der Schleife in Bereiche schreibst, die dich nichts angehen. (Windows maht dich sofort darauf aufmerksam, unter Linux könnte der Aufruf etwas subtilere Folgefehler verursachen(



  • Also den Zeigern habe ich malloc(1024) zur Verfügung gestellt. Eine Schleife for (int i= 0; i <1,..) schlägt auch fehl...

    die Funktion wird mit function(data1, data2) aufgerufen...



  • firsttime schrieb:

    Also den Zeigern habe ich malloc(1024) zur Verfügung gestellt. Eine Schleife for (int i= 0; i <1,..) schlägt auch fehl...

    die Funktion wird mit function(data1, data2) aufgerufen...

    Und wer hat Dir gesagt, daß sizeof( int ) == 1 ist?

    mfg Martin



  • Niemand?

    Ich kann Dir aber nicht ganz folgen...



  • firsttime schrieb:

    Also den Zeigern habe ich malloc(1024) zur Verfügung gestellt.

    Dir ist doch hoffenlich klar, daß ein int normalerweise größer ist als ein Byte - d.h. mit malloc(1024) bekommst du je nach System genug Platz für 512 oder 256 int's.

    PS: Die Bemerkung "die Funktion wird mit function(data1, data2) aufgerufen..." hilft bei der Fehlersuche auch nicht wirklich 😉



  • firsttime schrieb:

    Niemand?

    Ich kann Dir aber nicht ganz folgen...

    Fällt der Groschen nicht? Du hast 1024 Bytes mit malloc angefordert. Tust aber so, als ob 1000 Variablen vom Typ int Platz hätten. sizeof( int ) ist aber i.d.R. 2 oder 4. Korrekt wäre also

    int *ptr = (int*)malloc( 1000 * sizeof( int ) );
    

    mfg Martin



  • Nun, viel mehr ist da aber nicht.. So, nochmal zusammenfassend

    unsigned int *data1, *data2;
    .....
    
    void function (int *data1, int *data2){
    int *ptr1, *ptr2;
    ptr1 = data1;
    ptr2 = data2;
    
    //bis hierhin fehlerfrei und in der for-Schleife wird die exception geworfen)
    for (int i= 0; i<0x350;i++){
       *ptr1++ = 0;
       *ptr2++ = 0;
    }
    }
    
    int main()
    {
    data1 = (unsigned int*) malloc(1024);
    data2 = (unsigned int*) malloc(1024);
    
    function(data1, data2);
    }
    


  • firsttime schrieb:

    Nun, viel mehr ist da aber nicht.. So, nochmal zusammenfassend

    unsigned int *data1, *data2;
    .....
    
    void function (int *data1, int *data2){
    int *ptr1, *ptr2;
    ptr1 = data1;
    ptr2 = data2;
    
    //bis hierhin fehlerfrei und in der for-Schleife wird die exception geworfen)
    for (int i= 0; i<0x350;i++){
       *ptr1++ = 0;
       *ptr2++ = 0;
    }
    }
    
    int main()
    {
    data1 = (unsigned int*) malloc(1024);
    data2 = (unsigned int*) malloc(1024);
    
    function(data1, data2);
    }
    

    Warum steht da immer noch malloc( 1024 )? Warum mischt Du signed und unsigned ints?

    mfg Martin



  • firsttime schrieb:

    Nun, viel mehr ist da aber nicht.. So, nochmal zusammenfassend

    unsigned int *data1, *data2;
    .....
    
    void function (int *data1, int *data2){
    

    Und das schluckt dein Compiler?

    Außerdem überschreitest du mit 0x350 (=848) Schleifendurchläufen immer noch den Speicherbereich, den du per malloc() angefordert hast.



  • Ok, Danke..



  • CStoll schrieb:

    firsttime schrieb:

    Nun, viel mehr ist da aber nicht.. So, nochmal zusammenfassend

    unsigned int *data1, *data2;
    .....
    
    void function (int *data1, int *data2){
    

    Und das schluckt dein Compiler?

    Warum sollte er nicht?



  • Wutz schrieb:

    Warum sollte er nicht?

    Es könnte natürlich auch sein, daß ich die Regeln der impliziten Typumwandlungen (insbesondere zwischen Zeigern) nicht mehr korrekt in Erinnerung habe...


Anmelden zum Antworten