2017-06-18 105 views
0

我目前正在對猴子補丁c函數調用進行演示,想法是你有一個共享的c文件(例如:lib.c),它有一個導出的函數void foo()在頭文件lib.h中。覆蓋函數指針引發錯誤:非對象類型不可指派

目前我正在努力做到以下幾點:

#include <stdio.h> 
#include "lib.h" 

void (*foo_original)() = NULL; 
void foo_patch() 
{  
    puts("Before foo!"); 
    (*foo_original)(); 
    puts("Before foo!"); 
} 

int main() 
{ 
    foo_original = &foo; 
    foo = &foo_patch; 

    // Somewhere else in the code 
    foo(); 
} 

但是這給了我以下錯誤:

error: non-object type 'void()' is not assignable 

有誰知道我怎麼能解決這個問題?由於

回答

2

這條線:

foo = &foo_patch; 

是不是重新分配函數指針,而是試圖重新分配功能foo本身,因爲這是一個r-value這是不允許的地址。

如果您要重新指定指針foo_original而不是指向foo_patch,您會得到一個無限遞歸循環,因爲foo_patch調用foo_original指向的函數。

+0

所以,你所說的基本上是不可能覆蓋'foo()'的地址? – Paradoxis

+1

@paradoxis:沒錯。函數在名義上僅執行內存中具有固定地址。 – rici

相關問題