【发布时间】:2021-01-18 02:06:25
【问题描述】:
我的问题是关于在不同功能中释放分配的内存。所以我的代码结构如下:
int main()
{
// Declare variables
double *val1, *val2;
// Call function 1
function1(&val);
// Call function 2
function2(&val2);
// Do some stuff .....
// Free dynamically allocated memory
free(val1);
free(val2);
// End program
return 0;
}
void function1(double *val1)
{
/* Allocate memory */
val1 = (double*) malloc(n1*sizeof(double));
if (val1 == NULL){
printf("Error: Memory not allocated!");
exit(0);
}
}
void function2(double *val2)
{
// Allocate memory
val2 = (double*) malloc(n2*sizeof(double));
if (val2== NULL){
printf("Error: Memory not allocated!");
// Here I want to free val1!
exit(0);
}
}
意味着在function1中为val1分配了一些内存,在function2中为val2分配了一些内存。
现在,function2 不需要 val1 中包含的内容,所以我乍一看不必将指针传递给 val1。
但是,如果 val2 没有正确分配,我想退出程序,但首先释放所有分配的内存。我可以在 function2 中释放 val1 的内存而不传递 val1 的指针吗?
【问题讨论】:
-
“我可以在函数 2 中释放 val1 的内存而不传递 val1 的指针吗”。你会如何想象它的工作原理?当然,您可以通过例如使用全局变量来破解它。但这显然是不可取的。正常的做法是让调用代码处理这种错误检查和恢复。
-
另外,你的函数参数是错误的。这些参数必须是
double **,如果你想将分配的指针传回给调用者,分配需要是*val1 = malloc(..);。 -
指向指针的指针
-
请注意
function1和function2首先是错误的。val1内部的function1是 local 到function1。对val1的更改不会修改main的val1。相同形式function2. -
如果 malloc 失败,你的整个堆无论如何都是烤面包。那时的清理工作有点重要,执行中的任何东西都不太可能被挽救。
标签: c function dynamic-memory-allocation