免费的函数指针数组

时间:2014-09-24 13:20:26

标签: c arrays pointers

如果静态分配了一个函数指针数组,我还需要free()吗? 假设我有这段代码:

typedef void (*test_ptr)(void);

int main(void) 
{
    test_ptr test[3];
    test[0] = a;
    test[1] = b;
    test[2] = c;
}

所以,当我完成它时,我是否必须释放所有指针,也许是这样:

for(int i = 0; i < 3; i++) {
    free(test[i]);
}

或者当函数结束时它会像其他数组一样自动解除分配吗?

4 个答案:

答案 0 :(得分:4)

绝对不是!

像这样分配的数组位于堆栈中,free如果你尝试的话会失败。

顺便说一下,你显示的数组是而不是“静态”。我认为你的意思是“本地”,甚至是“自动”(虽然这可能与C ++概念混淆)。

除此之外。 2:堆栈上的分配意味着你应该不以这种方式分配大型数组。堆栈通常具有有限的容量,因此任何大的都应该通过malloc分配。

答案 1 :(得分:4)

  

所以,当我完成它时,我是否必须释放所有指针

没有。您不能因为free(ptr)仅在ptr个系列函数之前返回指针malloc时使用。 将free指针传递给任何其他对象(如变量或数组元素)会导致未定义的行为

C11:7.22.3.3自由功能:

  

[...]如果ptr是空指针,则不会发生任何操作。否则,如果参数与先前由内存管理函数返回的指针不匹配,或者如果通过调用freerealloc释放空间,则行为未定义


  

或者当函数结束时它会像其他数组一样自动解除分配吗?

是。一旦其封闭函数返回,它将不再存在。

答案 2 :(得分:2)

一旦创建它们的函数结束,就会销毁像你的情况那样的自动局部变量。在您的情况下,当main()函数结束时它们将被销毁。

因此,您不必明确free()这些变量。

答案 3 :(得分:2)

该代码是否拥有指向对象,是否分配了与freemalloc realloc calloc)对应的分配函数之一?

如果是,最后free

如果没有,请停止。

你显然是第二种情况......