Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这到底意味着什么(C+;+;函数指针)? 所以我在看一些C++源代码,想知道这到底是什么意思。我认为这意味着将tmp作为函数调用,但我不确定 char* tmp; ///stuff filling tmp with values ((void (*)())tmp)();_C++_C_Function Pointers - Fatal编程技术网

这到底意味着什么(C+;+;函数指针)? 所以我在看一些C++源代码,想知道这到底是什么意思。我认为这意味着将tmp作为函数调用,但我不确定 char* tmp; ///stuff filling tmp with values ((void (*)())tmp)();

这到底意味着什么(C+;+;函数指针)? 所以我在看一些C++源代码,想知道这到底是什么意思。我认为这意味着将tmp作为函数调用,但我不确定 char* tmp; ///stuff filling tmp with values ((void (*)())tmp)();,c++,c,function-pointers,C++,C,Function Pointers,是的,它将tmp转换为指向一个函数的指针,该函数不接受任何参数,也不返回任何内容,然后调用它 如果你问我的话,这看起来像是一种灾难。将字符*投射到函数指针并试图调用它。。。这有什么好处呢?它将tmp投射到一个指向具有签名的函数的指针void(),然后调用该函数@克里斯:动态生成机器代码并执行它并不少见,但这种特殊的方法在大多数现代操作系统上不起作用,因为。哦,它正在铸造它。。。现在有意义了。@ildjarn:这取决于tmp的内存分配方式。如果在Windows上使用VirtualAlloc+Vir

是的,它将
tmp
转换为指向一个函数的指针,该函数不接受任何参数,也不返回任何内容,然后调用它


如果你问我的话,这看起来像是一种灾难。

字符*
投射到函数指针并试图调用它。。。这有什么好处呢?它将
tmp
投射到一个指向具有签名的函数的指针
void()
,然后调用该函数@克里斯:动态生成机器代码并执行它并不少见,但这种特殊的方法在大多数现代操作系统上不起作用,因为。哦,它正在铸造它。。。现在有意义了。@ildjarn:这取决于
tmp
的内存分配方式。如果在Windows上使用
VirtualAlloc
+
VirtualProtect
或在POSIX系统上使用
PROT_EXEC
在可执行内存中分配,这是一种动态生成和执行机器代码的完美方式。顺便说一句,该程序非常有用。它不能完全处理完整表达式,但它可以告诉您,子表达式正在将
tmp
转换为“指向返回void的函数的指针”。在C中,可能有一个很好的用例。例如,可能存在一种基于队列的通用线程间通信机制,其中所有内容都以字符形式传递*然后我们需要在使用数据之前强制转换。从技术上讲,它是未定义的,因为C标准不允许您在非函数指针和函数指针类型之间强制转换。但大多数编译器允许它在大多数体系结构上作为扩展