2010-02-12 41 views
2

我在這裏遇到了一些問題,我弄亂了機器代碼和函數指針,還有一點是我的代碼,VC++只是拒絕編譯。找不到我的語法錯誤,VC++說有一個

這編譯,準確地按預期運行:

#include <stdlib.h> 
#include <stdio.h> 

int main() 
{ 
    char tarr[] = {0xb8, 222, 0, 0, 0, 0xc3}; 

    int (*testfn)() = tarr; 

    printf("%d", testfn()); // prints 222 

    getchar(); 
} 

但是,Visual C++快遞不會編譯如下,給這個錯誤:error C2143: syntax error : missing ';' before 'type'

#include <stdlib.h> 
#include <stdio.h> 

int main() 
{ 
    char* tarr = (char*) malloc(1000); 
    tarr[0] = 0xb8; 
    tarr[1] = 222; 
    tarr[2] = 0; 
    tarr[3] = 0; 
    tarr[4] = 0; 
    tarr[5] = 0xc3; 

    int (*testfn)() = tarr; // syntax error here 

    printf("%d", testfn()); 

    getchar(); 
} 

我已經看過了據說錯誤的代碼,我看不出有什麼問題。這是怎麼回事?有什麼我失蹤?

+1

with visual studio 2008第一個版本不編譯: 錯誤C2440:'初始化':無法從'char [6]'轉換爲'int(__cdecl *)(void)' – sergiom 2010-02-12 12:57:04

+0

@sergiom這很奇怪 - 第一個代碼片段在VC++ 2008 Express中編譯得很好 – 2010-02-12 13:06:21

回答

2

這是C代碼?如果是這樣,並且它不是C99,那麼您需要將testfd的聲明移至tarr [X]的賦值之前。

+0

哦,很酷,工作。我不知道我必須這樣做,所以我對編寫的第一個片段感到驚訝。 – 2010-02-12 13:04:44

+0

第一個snippit對於C 2010-02-12 13:05:50

+0

而且都是無效的C++ – Draemon 2010-02-12 13:10:20

1

代碼用GCC中的警告編譯並且無法用G ++編譯。你錯過了該線上的劇組。你也缺少來自main的返回值。

int (*testfn)() = (int (*)()) tarr; // no more syntax error? 
+0

演員陣容並沒有真正有所作爲,也沒有返回值。 – 2010-02-12 12:59:26

+0

是的,確實如此:警告是有原因的。在某些體系結構中,函數指針與數據指針的大小不同。我總是用-Wall編譯。 G ++實際上稱它爲錯誤,所以我想在這方面C++比C更嚴格。這*是你的問題。 – Draemon 2010-02-12 13:03:02

+0

不同的指針大小不是這裏唯一的問題 - 放置堆棧和/或堆的內存區域可能另外被標記爲不可執行 – Christoph 2010-02-12 13:06:45