我寫了一個方法來釋放我的結構。現在我有一個問題。當我調用這個方法兩次時,它給了我一個錯誤。但是我確實檢查了我的結構中是否有東西,所以我不知道它是如何給我帶來錯誤的。C釋放檢查不起作用
我的結構:
typedef struct {
int num_rows;
int num_cols;
int** data;
} matrix;
我的免費方法:
void free_matrix(matrix* m){
int i;
for(i=0;i<m->num_rows;i++){
if(m->data[i]!=NULL){
free(m->data[i]);
}
}
if(m->data!=NULL){
free(m->data);
}
}
額外的方法:
void fill_matrix_a(matrix* m){
m->data[0][0] = 1;
m->data[0][1] = 0;
m->data[0][2] = 2;
m->data[1][0] = 0;
m->data[1][1] = 3;
m->data[1][2] = 1;
}
void fill_matrix_b(matrix* m){
m->data[0][0] = 0;
m->data[0][1] = 3;
m->data[1][0] = 2;
m->data[1][1] = 1;
m->data[2][0] = 0;
m->data[2][1] = 4;
}
void init_matrix(matrix* m, int num_rows, int num_cols){
int i;
m->num_cols = num_cols;
m->num_rows = num_rows;
m->data = (int**) calloc(num_rows,sizeof(int*));
if(m->data==NULL){
printf("%s\n", "ERROR: probleem bij geheugenallocatie.");
exit(1);
}
for(i=0;i<num_rows;i++){
m->data[i] = (int*) calloc(num_cols,sizeof(int));
if(m->data[i]==NULL){ /* THE PROGRAM SAYS THIS IS TRUE BUT IT ISN'T BECAUSE I ALREADY FREED THE DATA OF B!! */
printf("%s\n", "ERROR: probleem bij geheugenallocatie.");
exit(1);
}
}
}
這給了我一個錯誤的方法:
void ex_1_matrix_operations(){
matrix a,b,c;
/* init a(2,3) and fill with elements */
init_matrix(&a,2,3);
fill_matrix_a(&a);
print_matrix(&a);
/* init b (default) and fill with elements */
init_matrix_default(&b);
fill_matrix_b(&b);
print_matrix(&b);
free_matrix(&a);
free_matrix(&b);
/* create unity matrix */
init_identity_matrix(&a,2);
print_matrix(&a);
free_matrix(&a);
free_matrix(&b); /* THIS IS WHERE MY ERROR OCCURS*/
}
什麼不行?你會得到什麼錯誤? – 2014-10-20 13:34:45
free()不會將指針設置爲NULL,您必須自己動手,但只是猜測這是您的問題... – 2014-10-20 13:36:02
您正在釋放'matrix_b'兩次。 – 2014-10-20 13:36:07