0

我正在开发一个小型 C 库,其中包含常用操作的函数,主要是为了提高我的 C 技能。在调试我的释放函数的会话中,我看到以前指向二维矩阵的指针的值不是NULL

我知道没有办法在释放后检查指针的状态(通过阅读这个问题),但我为这个指针分配了一个NULL值以避免它最终成为一个悬空指针。

功能代码为:

void matfree(void **M, int m){
int i;

for(i = 0; i < m; i ++){
    free(M[i]);
    M[i] = NULL;
}
free(M);
M = NULL;
}

测试代码(进入另一个文件):

int matfreetest(){
int **M = NULL;

M = (int **) matmalloc(0, 2, 2);
if(*M == NULL){
    printf("Here 1! \n");
    return 0;
}
matfree(M, 2);
if(*M == NULL){
    return 1;
}
else{
    printf("Here 2! \n");
    return 0;
}
}

int main(){
int status; 

status = matmalloctest();
printf("matmalloctest status = %d \n", status);
status = matfreetest();
printf("matfreetest status = %d \n", status);
system("PAUSE");
return 1;
}

我希望 matfreetest 返回状态 1,但它返回 0。这里做错了什么?

编辑:matmalloc的代码,根据要求:

/* Memory allocator for any type and size of matrix. 
Arguments:
-   int type:    identifier of the matrix' type
-   int m:       number of matrix rows
-   int n:       number of matrix columns
*/
void **matmalloc(int type, int m, int n){
int i;
void **M;

/* Check data type the do the proper allocation. */
if(type == INTEGER){ //int
    M = (int **) malloc(m*sizeof(int *));
    if(M == NULL){
        printf("Allocation failed! \n");
        return NULL;
    }
    for(i = 0; i < m; i ++){
        M[i] = (int *) malloc(n*sizeof(int));
        if(M[i] == NULL){
            printf("Allocation failed! \n");
            return NULL;
        }
    }
    printf("Allocation completed! \n");
    return M;
}
else if(type == SINTEGER){ //short int
    M = (short int **) malloc(m*sizeof(short int *));
    if(M == NULL){
        printf("Allocation failed! \n");
        return NULL;
    }
    for(i = 0; i < m; i ++){
        M[i] = (short int *) malloc(n*sizeof(short int));
        if(M[i] == NULL){
            printf("Allocation failed! \n");
            return NULL;
        }
    }
    printf("Allocation completed! \n");
    return M;
}
else if(type == LINTEGER){ //long int
    M = (long int **) malloc(m*sizeof(long int *));
    if(M == NULL){
        printf("Allocation failed! \n");
        return NULL;
    }
    for(i = 0; i < m; i ++){
        M[i] = (long int *) malloc(n*sizeof(long int));
        if(M[i] == NULL){
            printf("Allocation failed! \n");
            return NULL;
        }
    }
    printf("Allocation completed! \n");
    return M;
}
else if(type == FL){ //float
    M = (float **) malloc(m*sizeof(float *));
    if(M == NULL){
        printf("Allocation failed! \n");
        return NULL;
    }
    for(i = 0; i < m; i ++){
        M[i] = (float *) malloc(n*sizeof(float));
        if(M[i] == NULL){
            printf("Allocation failed! \n");
            return NULL;
        }
    }
    printf("Allocation completed! \n");
    return M;
}
else if(type == DOUB){ //double
    M = (double **) malloc(m*sizeof(double *));
    if(M == NULL){
        printf("Allocation failed! \n");
        return NULL;
    }
    for(i = 0; i < m; i ++){
        M[i] = (double *) malloc(n*sizeof(double));
        if(M[i] == NULL){
            printf("Allocation failed! \n");
            return NULL;
        }
    }
    printf("Allocation completed! \n");
    return M;
}
else if(type == LDOUB){ //long double
    M = (long double **) malloc(m*sizeof(long double *));
    if(M == NULL){
        printf("Allocation failed! \n");
        return NULL;
    }
    for(i = 0; i < m; i ++){
        M[i] = (long double *) malloc(n*sizeof(long double));
        if(M[i] == NULL){
            printf("Allocation failed! \n");
            return NULL;
        }
    }
    printf("Allocation completed! \n");
    return M;
}
else{
    printf("Incorrect type of matrix data. Only numeric types are accepted. \n");
    return NULL;
}
}
4

1 回答 1

3

作为 matfree 参数的“M”与调用程序中的参数不同。最好以不同的方式命名它以避免歧义。

你应该有:

M = matfree(M, 2); // Frees M and reassigns it to NULL

void **matfree(void **X, int m)
{
   int i;
   for(i = 0; i < m; i ++)
   {
       free(X[i]);
        X[i] = NULL;
   }
   free(X);
   return NULL;
}
于 2012-07-19T20:07:48.540 回答