由C中的static关键字定义的自由动态分配的内存

时间:2013-03-21 15:42:09

标签: c memory-management static

我正在编写一个代码,其中有几个函数。在每个函数中,有几个变量应该动态分配内存。这些函数被重复调用,因此分配内存一次并在main的末尾释放它是合乎逻辑的。

main函数如下所示:

//Some code here
while (err < tolerance){
        CalculateMismatch(M, err);
        //Update M and err and do other things
}
//Here is end of main, where I should free all the memories being allocated dynamically in other functions

此代码显示多次调用CalculateMismatch。所以,我只在这个函数中分配一次内存。像这样:

function CalculateMismatch(Some arguments){
        //The following line is illegal in C, but I do not know how to allocate the memory just once and reuse it several times.
        static double *variable1 = malloc(lengthofVar1 * sizeof(variable1));
        //Rest of the code
}

我的问题是我不知道如何访问CalculateMismatchmain中定义的变量。请告诉我如何释放变量,或者是否有更有效的方式来分配和释放内存。 感谢您的帮助。

提供有关我的代码的更多详细信息: 到目前为止,我已经全局定义了所有变量,并在main中动态分配了内存。但由于变量的数量很大,而且其中一些仅在一个特定函数中使用,我决定在函数内部移动定义。但是,我不知道如何释放每个功能内部分配的记忆。

3 个答案:

答案 0 :(得分:2)

这是不正确的:

 static double *variable1 = malloc(lengthofVar1 * sizeof(variable1));
你可能想要:

 static double *variable1 = malloc(lengthofVar1 * sizeof(*variable1));

不幸的是,你无法从函数外部释放这个变量,除非你做了一些事情来传回它。

对此没有直接的解决方案。一种解决方案当然是将变量移出一步:

static double *variable1 = 0;

function CalculateMismatch(Some arguments){

    if (!variable1) variable1 = malloc(lengthofVar1 * sizeof(*variable1));

        //Rest of the code
}

...
int main(...)
{
    ... 

    free(variable1);
}

答案 1 :(得分:0)

您无法从main访问CalculateMismatch中声明的变量。如果需要,则必须将声明移出CalculateMismatch(例如main),然后将它们作为参数传递给CalculateMismatch。

但是因为你即将离开主要我​​不认为你需要释放任何东西。无论如何,当程序退出时,所有内存都将被释放。

修改

您应该将variable1的声明移至main。然后将其作为参数传递给CalculateMismatch

int main()
{
    double *variable1 = malloc(...);
    ...
    while (...)
    {
        CalculateMismatch(..., variable1);
    }
    ...
    free(variable1);
}

答案 2 :(得分:0)

如果要从多个函数访问动态分配的内存,但又不想将指针作为参数传递,则将指针声明在文件范围(全局)。声明后,您可以在malloc需要之前初始化它,然后每个函数都能够访问内存。否则,只需将指针传递给需要访问内存的每个函数,您可以使用它直到free

C中函数内的静态变量是一个在函数调用之间保持其值的函数,并在程序运行之前初始化,因此您无法使用malloc对其进行初始化。