堆栈结构C的自由指针

时间:2014-01-17 20:44:43

标签: c struct malloc std calloc

给出以下用C编写的代码:

#include<stdio.h>
#include<stdlib.h>

typedef struct {
    int var;
    int **m;
} STRUCTURE;

int main() {
    STRUCTURE a;
    int i, j;

    a.var = 5;

    a.m = malloc(a.var * sizeof(int *));
    for(i = 0; i < a.var; i++) {
        a.m[i] = calloc(a.var, sizeof(int));
    }

    for(i = 0; i < a.var; i++) {
        a.m[i][i] = 1;
    }

    for(i = 0; i < a.var; i++) {
        for(j = 0; j < a.var; j++) {
            printf("%d ", a.m[i][j]);   
        }
        printf("\n");
    }

    return 0;
}

只会输出:

1 0 0 0 0 
0 1 0 0 0 
0 0 1 0 0 
0 0 0 1 0 
0 0 0 0 1 

鉴于结构是在main中声明的,但是它的指针是动态分配的,它们应该如何被释放?如果他们应该。

谢谢!

3 个答案:

答案 0 :(得分:5)

malloc编辑的任何内容也必须为free d。退出时会出现异常,因为OS通常会声明内存(取决于操作系统)。尽管技术上不会造成内存泄漏,但它仍然被认为是不好的做法。

免费应按照你用来分配的相反顺序完成。

for(i = 0; i < a.var; i++) {
    free(a.m[i]);
free(a.m);

原因是,你释放指针之前你不能释放主体,因为它们不再可以访问。

答案 1 :(得分:4)

free()的工作方式与malloc的工作方式相同,但您通常希望它的顺序相反。你应该使用类似的东西:

for(i = 0; i < a.var; i++) {
    free (a.m[i]);
}
free (a.m);

答案 2 :(得分:1)

反向

for(i = 0; i < a.var; i++) {
    free(a.m[i]);
}
free(a.m);