c++ - C++ 中的异常,函数指针为 : Access violation executing location 0x00000000

标签 c++

我在使用函数指针并将它们作为输入传递给 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。 如果有这个异常的处理程序,程序可以安全地继续。

出了什么问题?有趣的是,如果我们在 source.cpp 文件中定义这些函数 oneapplyfunction (即将所有代码放在一个文件中),事情似乎就可以了。所以,我认为我弄错的一定是非常简单的事情。感谢您的帮助。

最佳答案

real_function one;

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

applyfunction(10, one, result);

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

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

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

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

double one(double x);

关于c++ - C++ 中的异常,函数指针为 : Access violation executing location 0x00000000,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33190968/

相关文章:

c++ - 文本编辑器中的行管理

c++ - 删除链表的最后一个节点

c++ - 如何分配具有 const 成员的数据对象?

c++ - 在 C++ 源文件中每个函数定义的开头添加一个宏调用

c++ - 对 "conclusionaryOutput(number1, number2, isASquare1, isASquare2)"的调用引发错误,我不确定为什么

c++ - DirectX 12 开发现在对公众开放了吗?

c++ - Microsoft fakes framework是否支持c++/非托管代码

c++ - 另一个 “expected unqualified-id before numeric constant”错误

c++ - 为什么 pow(sqrt(-1), 2) 不返回 -1?

c++ - 为什么到目前为止复合文字还不是 C++ 的一部分?