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; }Tuttavia, se forzo gcc a compilare a 32 bit specificando -m32, allora il programma fila liscio e non si presenta alcun problema...codice:$ gcc -lm -o test test.c && ./test
Non ci sto capendo più niente, qualcuno ha un'idea? Thx.

Rispondi quotando
)
