我正在开发一个小型 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;
}
}