在堆中分配的函数指针

时间:2019-05-02 19:18:32

标签: c pointers malloc function-pointers

我想声明一个局部函数指针,在堆上为该指针分配空间,并随即指向不同的函数。

#include<stdlib.h>
#include<string.h>
#include<stdio.h>
#include<unistd.h>

void fun(){
 printf("fun");
}

typedef void(*fp)();

int main(){
 fp f; //local pointer
 f = malloc(sizeof(f)); //allocate space for a pointer on the heap
 (*f) = &fun; //write the address of fun into the space allocated in heap
 (*f)(); // so that the contents in f, is the address of fun
}

但是我在(*f) = &fun;遇到了一个编译错误,内容为:error: lvalue required as left operand of assignment。我应该如何正确地做到这一点?

这看起来并不像xy问题:我想重现此处提到的漏洞利用:Use after free exploit

1 个答案:

答案 0 :(得分:4)

您无法分配给*fp,因为该表达式具有函数类型。

fp用于存储指针,在这种情况下为函数的指针。因此,您无需分配任何内容。只需分配函数的地址即可:

fp f;
f = &fun;
(*f)();

还请注意,函数类型的表达式会自动转换为指向该函数的指针(包括调用该函数的指针),因此也可以这样做:

fp f;
f = fun;
f();

编辑:

如果您真正想要的是为函数指针动态分配空间,那么您需要一个指向函数指针的指针来存储它:

fp *f;                   // fp is void (*)(), so f is void(**)()
f = malloc(sizeof(*f));  // allocate space for function pointer
*f = func;
(*f)();     // func called

free(f);
fp *g;
g = malloc(sizeof(*g));   // possibly points to what f pointed to?
*g = evil_f;

(*g)();    // evil_func called

请注意,以上代码会调用未定义的行为,并且仅在无法优化存储在f中的值并且重用同一内存区域以分配给g的实现上起作用。