2010-02-12 62 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