c - 理解调用函数指针

标签 c function-pointers

我试图理解什么是c中函数的指针。

我想要一些调用函数指针的详细过程,因此,我可以更好地理解函数指针。

有人可以解释一下为什么我下面的代码不会崩溃并且有一些有线输出吗? 为了缩小范围,我正在寻找类似 javap 的东西,它可以解释 jdk 如何编译 我的代码和 jvm 运行我的代码

  1. void 返回与数字 14,15 或 16 有何关系。 (void函数返回)
  2. 我的第二个参数是否存在安全问题,或者与非 init val 相同吗?

测试.c

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


static void f(int x, int y){

    printf("x = %d \n",  x );
    printf("y = %d \n",  y );
}

typedef int (*FUNC)(int);

int main(void){

    long int addr = (long int)f;
    printf("%d \n",  (int)((FUNC)addr)(1) );

    return 0;
}

使用 i686-apple-darwin11-llvm-gcc-4.2 编译的 macOS 上的输出

x = 1 
y = 1479046720 
16 

最佳答案

答案是未定义的行为。您正在使用两种不兼容的函数指针类型,并使用一种来调用另一种。 (更不用说将指针存储在整数等中)因此,您的程序会调用未定义的行为,因此任何事情都可能发生。你得到的值很可能只是来自困惑的堆栈和/或 CPU 寄存器的随机垃圾。

关于c - 理解调用函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14671778/

相关文章:

Javascript:将构造函数作为变量中的引用传递并调用此构造函数

c - typedef 函数指针 -> 从不兼容的指针类型初始化

c - 如何修复 "found Rust tuple type in foreign module; consider using a struct instead"警告

c - 为什么 ls 不能与 execvp 一起工作?

java - Java 中的函数指针/委托(delegate)?

c++ - c++ 静态虚拟方法的替代方案

c - 为什么函数指针可以带或不带运算符地址使用?

c - 反转文件中的单词

c - 一个 strcpy gcc 内联汇编代码

c - 函数指针或跳转表