使用函数指针C++异常:访问冲突执行位置0x00000000

Exception in C++ with function pointers: Access violation executing location 0x00000000

本文关键字:访问冲突 执行 位置 0x00000000 异常 函数 指针 C++      更新时间:2023-10-16

我在函数指针方面遇到了一些问题,并将它们作为输入传递给C++中的其他函数。我写了一些简化的代码来总结我遇到的麻烦。我有两个.cpp文件如下

函数.cpp

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define _CRT_SECURE_NO_WARNINGS
typedef double(*real_function)(double);
double one(double x) {
    return double(1);
}
void applyfunction(int length, real_function f, double* result) {
    int j;
    result[0] = 0;
    for (j = 1; j < length; j++) {
        result[j] = f(result[j - 1]);
    }
}

资料来源.cpp

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define _CRT_SECURE_NO_WARNINGS
typedef double(*real_function)(double);
real_function one;
void applyfunction(int, real_function, double*);
int main(void) {
    double* result;
    result = (double*)calloc(10, sizeof(double));
    applyfunction(10, one, result);
    return(0);
}

当我编译它时,我在Visual Studio 2015中收到以下错误

在 Project3.exe 中0x00000000引发异常:0xC0000005:访问冲突执行位置0x00000000。如果存在此异常的处理程序,则可以安全地继续该程序。

出了什么问题?有趣的是,如果我们定义这些函数 one 并在源代码文件中应用函数.cpp(即将所有代码放在一个文件中(,事情似乎可以正常工作。所以,我认为我弄错了一定很简单。感谢您的任何帮助。

real_function one;

这将创建一个全局变量one该变量初始化为空指针。

applyfunction(10, one, result);

然后将该空指针传递给applyfunction...

result[j] = f(result[j - 1]);

。其中你尝试调用它,生成空指针异常。

要解决此问题,请不要在 Source.cpp 中创建变量one。相反,请添加与 functions.cpp 中的定义匹配的原型。换句话说,将real_function one;替换为

double one(double x);
real_function one;

不声明函数one在另一个文件中;它定义了一个名为 one 的函数指针。因为它是全局的(因此具有静态存储(,所以它被初始化为 null。程序崩溃,因为它尝试调用空指针。

解决此问题的一种方法是更改

typedef double(*real_function)(double);

typedef double real_function(double);

这样real_function实际上命名函数类型(而不是指针(。