Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
堆栈结构C中的自由指针_C_Struct_Malloc_Std_Calloc - Fatal编程技术网

堆栈结构C中的自由指针

堆栈结构C中的自由指针,c,struct,malloc,std,calloc,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;

给定以下用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;
}
考虑到结构是在main中声明的,但是来自它的指针是动态分配的,那么应该如何释放它们呢?如果他们应该的话

谢谢大家!

相反

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

for(i = 0; i < a.var; i++) {
    free(a.m[i]);
}
free(a.m);
for(i=0;i
任何你
malloc
ed的东西都必须是
免费的
d。例外情况是退出时,因为操作系统通常会要求内存(取决于操作系统)。尽管从技术上讲这不会是内存泄漏,但它仍然会被视为不好的做法

免费的应该按照与您分配所使用的相反的顺序进行

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

原因是,您不能在释放主体中的指针之前释放主体,因为它们不再可访问。

任何您
malloc
ed的内容都必须是
free
d。退出时会出现异常,因为通常操作系统都会要求内存(取决于操作系统)。尽管从技术上讲这不会是内存泄漏,但这仍将被视为不好的做法

免费的应该按照与您分配所使用的相反的顺序进行

for(i = 0; i < a.var; i++) {
    free(a.m[i]);
free(a.m);
for(i=0;i
原因是,在释放主体中的指针之前,您无法释放主体,因为它们不再可访问。

free()
的工作方式与
malloc
的工作方式相同,尽管您通常希望以相反的顺序释放主体。您应该使用类似于:

for(i = 0; i < a.var; i++) {
    free (a.m[i]);
}
free (a.m);
for(i=0;i
free()
的工作方式与
malloc
的工作方式相同,尽管您通常希望它的顺序相反。您应该使用类似以下的方式:

for(i = 0; i < a.var; i++) {
    free (a.m[i]);
}
free (a.m);
for(i=0;i
它们应该是,使用
免费
…提示:这类似于您
malloc
对它们进行的操作。它们应该是,使用
免费
…提示:这类似于您
malloc
对它们进行的操作。从来都不知道。您对此有引用吗?我认为您不需要引用!指向堆分配对象的指针放在中e> a.m[i]
这就是您需要
free()
的内容。显然,您需要
free(a.m)
之后,否则在
free(a.m[i]时,您将取消对已释放内存的指针的引用
非常感谢您的回答!:)@a Ligh哦,是的,当然,我读得不太好,以为您说的更笼统,但在本例中,您是对的。我的意思是,如果您将指针保存到一个数组元素,则顺序不会产生任何影响,因此您可以
释放
指针数组,而不必
释放
'Ing单个元素。我为奇怪的混乱感到抱歉。^^^我从来不知道。你对此有引用吗?我认为你不需要引用!指向堆分配对象的指针放在
a.m[I]
中,所以你需要
free()
。显然你需要
free(a.m)
after,否则在
free(a.m[i])时,您将取消对已释放内存的指针的引用
非常感谢您的回答!:)@a Ligh哦,是的,当然,我读得不太好,以为您说的更笼统,但在本例中,您是对的。我的意思是,如果您将指针保存到一个数组元素,则顺序不会产生任何影响,因此您可以
释放
指针数组,而不必
释放
'Ing单个元素。我为奇怪的混乱感到抱歉^^^如果我在
main
中声明我的结构并将其地址发送到
void函数(结构*a)中该怎么办
我在该函数中分配我的矩阵。我可以按照您从“main”中所说的方式释放我的矩阵,还是必须从该函数中释放它?您可以在任何地方释放它。但是,您应该知道范围。如果您将指针传递给将释放它的函数,则调用方仍然拥有该指针,但它当然不再有效RE是一个限制,使用相同的方法来释放内存,因为如果你把C和C++代码混合在一起,你就不应该使用<代码>新的< /COD> >而不是<代码>免费< /代码>,而不是使用<代码> Dele> <代码>。当然,同样的方法也适用于Kerrisk。(正如你所指出的,退出后自动释放()是正确的。)他的结论基本上是“meh”。至少在Linux上,他有点权威性,人们会持有关于需要释放的宗教信仰,仅供参考——我认为你可能感兴趣。:)这正是他所讨论的(守护进程等),同意。无论发生什么情况,您都经常将其视为绝对值。我释放了我使用的所有内容;这实际上只是供参考。@gnometorule,我同样怀疑是否需要始终检查返回的指针是否为空。是否有适当的“内存不足”在一个复杂的程序中处理,这是一种幼稚的方式,但每个人都把它当作圣经来宣扬。如果我在
main
中声明我的结构,并将其地址发送到
void函数(结构*a)中会怎么样
我在该函数中分配我的矩阵。我可以按照您从“main”中所说的方式释放我的矩阵,还是必须从该函数中释放它?您可以在任何地方释放它。但是,您应该知道范围。如果您将指针传递给将释放它的函数,则调用方仍然拥有该指针,但它当然不再有效RE是一个限制,使用相同的方法来释放内存,因为如果您将C和C++代码混合,则不应使用<代码>新< /COD> >以后<代码>免费< /代码>,而使用<代码> Debug < /Cord>。当然,同样的方法也适用于Kerrisk devot。