我想声明一个局部函数指针,在堆上为该指针分配空间,并随即指向不同的函数。
#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
答案 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
的实现上起作用。