[英]Exception in C++ with function pointers: Access violation executing location 0x00000000
我在使用函數指針時遇到麻煩,並將它們作為輸入傳遞給C ++中的其他函數。 我寫了一些簡化的代碼,總結了我遇到的麻煩。 我有兩個.cpp文件,如下所示
functions.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]);
}
}
Source.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文件中定義了一個函數並應用了函子 ( 即將所有代碼放在一個文件中),那么一切似乎就可以了。 因此,我認為我犯錯一定很簡單。 感謝您的任何幫助。
real_function one;
這將創建一個全局變量one
,並將其初始化為空指針。
applyfunction(10, one, result);
然后,您將該空指針傳遞給applyfunction
。
result[j] = f(result[j - 1]);
...在其中嘗試調用它,生成空指針異常。
為了解決這個問題,不要創建一個變量one
在Source.cpp
。 而是添加一個與functions.cpp
中的定義匹配的原型。 換句話說,將real_function one;
替換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
實際上可以命名函數類型(而不是指針)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.