2010-02-12 3 views
2

여기에 약간의 문제가 있습니다. 컴퓨터 코드와 함수 포인터를 사용하고 있습니다. VC++에서 단순히 거부하는 코드가 있습니다. 컴파일하기.내 구문 오류를 찾을 수 없습니다. VC++에서 하나라고 말합니다.

이 컴파일 예상대로 정확히 실행

: 내가 검토 한 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(); 
} 

:이 오류를주고,

#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++ Express를 를 다음과 컴파일되지 것 코드가 잘못된 것 같아서 잘못된 점이 아무것도 없습니다. 무슨 일이야? 내가 빠진 것이 있습니까?

+1

Visual Studio 2008에서 첫 번째 버전은 컴파일되지 않습니다. 오류 C2440 : '초기화': 'char [6]'에서 'int (__cdecl *) (void)'로 변환 할 수 없습니다. – sergiom

+0

@sergiom VC++ 2008 Express에서 snippet이 잘 컴파일됩니다. –

답변

2

이 C 코드가 있습니까? 그렇다면 C99가 아니므로 testfd의 선언을 tarr [X]에 할당하기 전에 이동해야합니다.

+0

오, 멋지다. 나는 그 일을해야한다는 것을 몰랐다. 그래서 나는 첫 번째 발췌 문장을 집계했다. –

+0

첫번째 스 니핏은 C

+0

그리고 둘 다 유효하지 않습니다. C++ – Draemon

1

코드가 GCC의 경고와 함께 컴파일되고 G ++로 컴파일되지 않습니다. 그 줄에 캐스트가 누락되었습니다. 또한 main에서 리턴 값을 잃어 버렸습니다.

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

캐스트가 실제로 차이를 만들지 않으며 반환 값도 않습니다. –

+0

예 : 경고는 이유가 있습니다. 일부 아키텍처에서는 함수 포인터가 데이터 포인터와 다른 크기입니다. 나는 항상 - 벽으로 컴파일한다. G ++은 실제로 에러라고 부릅니다. 그래서 C++은 C보다 엄격합니다. 그건 네 문제 야. – Draemon

+0

다른 포인터 크기는 여기서 유일한 문제가 아닙니다. 스택 및/또는 힙이 배치되는 메모리 영역이 추가로 실행 불가능으로 표시 될 수 있습니다. – Christoph