【发布时间】:2015-06-09 00:29:56
【问题描述】:
我知道void * 并且函数指针无法安全地转换。
我的问题是下面的代码。
#include <stdio.h>
#include <stdlib.h>
void f(void *);
void g(void) {
printf("hello world\n");
}
int main(void) {
void (*p)(void) = g;
void (**pp)(void) = malloc(sizeof(void (*)(void)));
pp = &p;
f(pp);
free(pp); //segfault
return EXIT_SUCCESS;
}
void f(void *p) {
(*(void (**)(void))p)();
}
它在 gcc 中使用 -Wall -Wextra -pedantic -std=c99 编译得很好,但在程序调用 free 时在运行时失败。在这种情况下有什么问题?指向函数指针的指针不是数据指针吗?
三思而后行:
正确的代码是这样的,
int main(void) {
void (*p)(void) = g;
f(&p);
return EXIT_SUCCESS;
}
我不知道为什么我会感到困惑:/
【问题讨论】:
-
pp已经被&p重写。free(pp)是 UB。 -
我认为您需要阅读
malloc()并深入了解它的作用和用途。
标签: c pointers function-pointers