簡體   English   中英

C ++中帶有函數指針的異常:訪問沖突執行位置0x00000000

[英]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]);

...在其中嘗試調用它,生成空指針異常。

為了解決這個問題,不要創建一個變量oneSource.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM