C中的函数指针如何工作? -具体例子

时间:2018-10-25 16:14:43

标签: c function-pointers

所以,我知道这个问题以前曾被问过。我仍然不了解以下内容:

#include <stdio.h>

main() {
    volatile int (*fp)();
    char buffer[64];
    fp = 0;

    if(fp){
        printf("Buffer Overflow, jumping to %p", fp);
        fp();
    }
}

第一行声明函数指针fp。第三行向函数指针建议值0,该值应等于地址0(&0)。现在,这就是指针指向的内存地址的内容。因此,if陈述永远都不会成真。尽管如此,应该变为现实,它将被执行。如果执行了该命令,printf函数将打印现在存储在指针fp中的地址。

但是最后一行(fp())在做什么?对我来说,似乎我在尝试调用函数fp(),指针fp指向该地址。但是此函数尚未在此代码中定义。那么,这是在做什么呢?

2 个答案:

答案 0 :(得分:1)

volatile限定符表示fp的值可能会在此函数的代码控制范围之外随时更改(这会阻止编译器执行某些操作fp的优化)。实际上,您可以在已被内存映射的对象上使用限定符,或者可以通过中断来修改全局对象,或者类似的方法。在这种特定情况下,没有理由期望fp被此代码外部的内容所更改。

但是,代码的目的是将 if fp更改为非NULL值(即设置为指向函数),然后此代码将打印该指针值,然后执行所指向的函数

答案 1 :(得分:0)

此“代码”假定使用C标准保证的内容。

fp = 0;-为FP分配NULL指针(并发出警告)

您应该使用fp = NULL;,或者如果不确定NULL指针在内存中的内部表示形式(在您的实现中为零),fp = (int (*)())0;

现在,程序假定将fp放在 之后的缓冲区中,这是C语言无法保证的。实现可以按自己的方式对变量进行排序。

但是即使假设该顺序-如果将缓冲区写出边界(但只有在缓冲区大小小于sizeof(fp)并且写入的数据不为零的情况下,缓冲区才会起作用),fp不会变为空值。但是您不能调用它,因为它将包含一个随机地址,并且您的程序将崩溃