c - 如果函数指针与数组地址一起传递会发生什么

标签 c

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/

相关文章:

c - 释放双指针

java - 我对数据抽象定义的回答

c - 来自curl_easy_perform的管道数据

c - "file_name.exe has stopped working"

CUPS 对 cupsGetDests() 的 undefined reference

c++ - _CrtSetAllocHook - 未处理的异常

c - 用 C 编写的操作系统电源控制实用程序

c++ - 在 C++ 中重新定义 C 函数

c - 用指针在c中进行嵌入式编程

CPP_Magic IF_ELSE 宏?