我在使用函数指针并将它们作为输入传递给 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 文件中定义这些函数 one 和 applyfunction (即将所有代码放在一个文件中),事情似乎就可以了。所以,我认为我弄错的一定是非常简单的事情。感谢您的帮助。
最佳答案
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/