堆栈结构C中的自由指针
给定以下用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;
#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。