2010-02-12 6 views
2

Je suis en train de rencontrer un problème ici, je suis en train de déconner avec du code machine et des pointeurs de fonction, et il y a un peu de code que VC++ refuse compiler.Je ne trouve pas mon erreur de syntaxe, VC++ dit qu'il y en a un

Cette compile et fonctionne exactement comme prévu:

#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(); 
} 

Toutefois, Visual C++ express ne compiler ce qui suit, donnant cette erreur: 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(); 
} 

Je l'ai regardé le code prétendument défectueux et je ne vois rien de mal à cela. Que se passe-t-il? Y a-t-il quelque chose qui me manque?

+1

avec Visual Studio 2008 la première version ne compile pas: erreur C2440: 'initialisation': ne peut pas convertir de 'char [6]' en 'int (__cdecl *) (void)' – sergiom

+0

@sergiom C'est étrange - le premier extrait compile bien pour moi dans VC++ 2008 Express –

Répondre

2

Est-ce le code C? Si c'est le cas, et ce n'est pas C99 alors vous devez déplacer la déclaration de testfd avant les assignations à tarr [X].

+0

Oh cool, cela a fonctionné. Je ne savais pas que je devais le faire, alors je suis surpris par le premier extrait compilé. –

+0

Le premier extrait est correct pour C

+0

Et les deux ne sont pas valides C++ – Draemon

1

Le code compile avec des avertissements dans GCC et ne peut pas être compilé avec G ++. Il vous manque un casting sur cette ligne. Il vous manque également une valeur de retour de main.

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

La distribution ne fait pas vraiment de différence, et la valeur de retour non plus. –

+0

Oui c'est le cas: L'avertissement est là pour une raison. Sur certaines architectures, les pointeurs de fonction ont une taille différente de celle des pointeurs de données. Je compile toujours avec -Wall. G ++ l'appelle en fait une erreur, donc je suppose que C++ est plus strict que C à cet égard. C'est * votre * problème. – Draemon

+0

différentes tailles de pointeurs ne sont pas le seul problème ici - la zone de mémoire où la pile et/ou tas sont placés peut en outre être marqué non-exécutable – Christoph

Questions connexes