typedef void(*FUNC)(void);
int main(void)
{
//intptr_t m;
const static unsigned char insn[4] = { 0xff, 0xff, 0xff, 0xff };
FUNC function = (FUNC) insn;
function();
}
上面的代码给我一个非法指令的输出。有人可以解释为什么吗? 。是否是因为函数指针没有函数的地址(因为它有数组的地址,所以无法跳转到该地址)
最佳答案
由于指向数组第一个元素的指针不是指向函数的指针,因此您可以通过变量 function
调用“函数”来调用未定义的行为。当您调用未定义的行为时,任何事情都可能发生。非法指令导致的崩溃是完全合法的;删除磁盘上的所有数据也是如此。
根据标准,没有什么可以“预期”的。正如注释中所暗示的,可能发生的情况是,存储在堆栈上的数组 insn
中的字节(以及堆栈的其余部分,以及 main() 的堆栈帧)
以及诸如参数列表和环境变量之类的内容)将被视为机器代码。对您来说幸运的是,其中一个字节是无效(或非法)指令,并且程序停止。
关于c - 如果函数指针与数组地址一起传递会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18731767/