免费的函数指针数组

use*_*687 2 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;
}
Run Code Online (Sandbox Code Playgroud)

因此,当我完成该操作后,是否需要释放所有指针,也许像这样:

for(int i = 0; i < 3; i++) {
    free(test[i]);
}
Run Code Online (Sandbox Code Playgroud)

还是像其他数组一样在函数结束时自动取消分配?

ams*_*ams 5

绝对不!

像这样分配的数组位于堆栈上,free如果您尝试它,将会严重失败。

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

撇开没有。2:在堆栈上分配意味着您不应该以这种方式分配大数组。堆栈的容量通常有限,因此任何大的内容都应该通过malloc.


hac*_*cks 5

因此,当我完成该操作后,是否必须释放所有指针

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

C11:7.23.2.3的免费功能:

[...]如果ptr为空指针,则不执行任何操作。否则,如果参数与内存管理函数先前返回的指针不匹配,或者如果通过调用freeor 释放了空间realloc,则该行为是undefined


还是像其他数组一样在函数结束时自动取消分配?

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