繁体   English   中英

堆栈结构C中的自由指针

[英]Free Pointer from Stack Structure C

给出以下用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中声明的,但是来自它的指针是动态分配的,那么如何释放它们呢? 如果他们应该。

谢谢!

malloc所有内容也必须是free 退出时是个例外,因为通常情况下OS仍会占用内存(取决于OS)。 即使从技术上讲,这不是内存泄漏,但仍然会被认为是不好的做法。

免费应该按照与分配时相反的顺序进行。

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

原因是,您无法在释放主体内部之前释放主体,因为它们不再可访问。

free()malloc工作方式相同,尽管通常您希望以相反的顺序进行操作。 您应该使用类似以下内容的东西:

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

相反

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM