使用函数指针C++异常:访问冲突执行位置0x00000000
Exception in C++ with function pointers: Access violation executing location 0x00000000
我在函数指针方面遇到了一些问题,并将它们作为输入传递给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
实际上命名函数类型(而不是指针(。
相关文章:
- 写入位置0x0000000C时发生访问冲突
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 链表中写入访问冲突的未知原因
- C++中的openCV Mat访问冲突
- C++尝试深度复制唯一指针时出现内存访问冲突
- C++ 中动态二维数组的访问冲突
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- 写入访问冲突异常
- 在类 12.exe 中0x7B37FF80 (ucrtbased.dll) 引发异常: 0xC0000005:访问冲突读
- 0xC0000005:访问冲突写入位置0xCDCDCDCD动态分配错误
- 读取访问冲突.这0xCDCDCDCD
- 0xC0000005:访问冲突读取位置 0x00000000. 重载 == 运算符的问题
- 插入数组时违反写访问冲突
- 在链接的程序集文件中,我想从 c++ 调用代码访问变量.是否可以在不触发访问冲突的情况下执行此操作?
- 调用隔离后访问冲突执行位置0x0000000000000000:New()
- 执行指针时发生C++访问冲突
- VS2010 访问冲突,同时使用 F10 或 F11 单步执行代码
- 执行位置0x00000000时发生glCreateProgram访问冲突
- 使用函数指针C++异常:访问冲突执行位置0x00000000
- 0xC0000005:访问冲突执行位置0x00000000.(OpenGL)