Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1

    [C] Doble free or corruption

    In università ho scritto un programma per un esercitazione senza avere alcun problema (gcc a 32bit).
    Torno a casa, provo a compilare e a testare (amd64, sistema x86_64 con gcc che compila quindi a 64 bit) ma quando arrivo al primo ciclo nella matrix_free ho un errore di doble free or corruption. Posto qui sotto una versione minimale dell'applicazione dove è possibile riprodurre il bug:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    struct strMatrix {
            int r, c;
            float **elem;
    };
    
    typedef struct strMatrix *Matrix;
    
    //Prototypes
    Matrix matrix_init_sequence(int rows, int columns, float start, float dx);
    void matrix_free(Matrix *m);
    
    //Definitions
    Matrix matrix_init_sequence(int rows, int columns, float start, float dx) {
            Matrix matrix = (Matrix) malloc(sizeof(struct strMatrix));
            int r, c;
            matrix->r = rows; matrix->c = columns;
            matrix->elem = (float**)calloc(rows, sizeof(float));
            for (r=0; r<rows; r++) {
                    matrix->elem[r] = (float*)calloc(columns, sizeof(float));
                    for (c=0; c<columns; c++, start+= dx) matrix->elem[r][c] = start;
            }
            return matrix;
    }
    void matrix_free(Matrix *m) {
            int r;
            if (*m == NULL) return;
            for (r=0; r< (*m)->r; r++) {
                    printf("%d\n",r ); //debug
                    free( (*m)->elem[r] );  //<<= errore qui al primo loop
                    printf("fatto;\n"); //debug
            }
            printf("\n");
            free((*m)->elem);
            free(*m); *m = NULL;
    }
    
    int main(){
            Matrix b = matrix_init_sequence(4, 2, 1.0, 0.0);
            matrix_free(&b);
            
            return 0;
    }
    codice:
    $ gcc -lm -o test test.c && ./test
    Tuttavia, se forzo gcc a compilare a 32 bit specificando -m32, allora il programma fila liscio e non si presenta alcun problema...
    Non ci sto capendo più niente, qualcuno ha un'idea? Thx.
    GreyFox (Linux registered user #435102)
    greyfox.imente.org - GreyFox's shots (photo gallery)
    $ cd /pub
    $ more beer

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Mi sa che tutto il problema dipende da questa riga

    matrix->elem = (float**)calloc(rows, sizeof(float));

    che dovrebbe essere

    matrix->elem = (float**)calloc(rows, sizeof(float*));

  3. #3
    porca miseria è vero grazie non mi ero proprio accorto che mancasse l'asterisco
    assurdo però che a 32 bit me la faccia passare liscia...
    GreyFox (Linux registered user #435102)
    greyfox.imente.org - GreyFox's shots (photo gallery)
    $ cd /pub
    $ more beer

  4. #4
    Con gcc (a 64) a me non fa una piega... :master:
    Anzi crea un'eseguibile funzionante
    Experience is what you get when you don’t get what you want

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da GreyFox86
    porca miseria è vero grazie non mi ero proprio accorto che mancasse l'asterisco
    assurdo però che a 32 bit me la faccia passare liscia...
    Non e' assurdo ... pensaci ...

  6. #6
    (Si, occupano gli stessi byte...)
    Ma come è possibile che a me non da nessun errore lo stesso codice, in gcc a 64 bit?
    Experience is what you get when you don’t get what you want

  7. #7
    ??
    No sul mio gcc sono entrambi 4 byte !?
    Sul gcc a 64 non dovrebbe essere 8 il float?
    Experience is what you get when you don’t get what you want

  8. #8
    Niente di particolare semplicemente gcc non funziona sempre al top su windows...
    Experience is what you get when you don’t get what you want

  9. #9
    codice:
    $ gcc aa.c -o a && ./a
    sizeof(float)=4
    sizeof(float*)=8
    $ gcc -m32 aa.c -o a && ./a
    sizeof(float)=4
    sizeof(float*)=4
    ...quindi, inizializzo 4 byte al posto di 8 per ogni elemento, così quando arrivo alla free questa visto il tipo del parametro in input float* si aspetterebbe celle da 8 bit anzichè da 4, dal che deriva l'errore a runtime. Giusto?
    GreyFox (Linux registered user #435102)
    greyfox.imente.org - GreyFox's shots (photo gallery)
    $ cd /pub
    $ more beer

  10. #10
    Si (certo che oregon sa il fatto suo )
    Experience is what you get when you don’t get what you want

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.