2012-08-10 9 views
1

J'écris du code pour obtenir un vidage hexadécimal de la pile dans c. Je continue d'obtenir une erreur de compilation sur cette ligne suivante quand je la compile en utilisant gcc dans ubuntu mais elle compile bien sous gcc dans windows.Cast char * à int

char buffer[10]; 
for (int i=0;i<20;i++) 
    printf("0x%lx => 0x%lx\n", &(buffer[i]), ((long *)buffer)[i]); 

Ceci est le message que le compilateur donne.

avertissement: format « lx% » attend de type « unsigned long int », mais l'argument 2 a le type « char * »

Quelqu'un peut-il s'il vous plaît me dire si je suis en train de faire quelque-chose ne va pas?

+0

Le compilateur vous dit à peu près ce que vous faites mal. Et aussi tout est comportement indéfini :-( –

+0

Vous accédez également à la mémoire non allouée, en particulier l'accès au tampon comme pointeur long –

+0

@KerrekSB, merci pour votre contribution utile –

Répondre

2

Essayez:

char buffer[10]; 
for (int i=0;i<20;i++) 
    printf("%p => 0x%lx\n", (void*)&(buffer[i]), ((long *)buffer)[i]); 

Le 2 arg, &(buffer[i]) est de type char*, donc il a besoin d'un casting et un %p. Le 3ème argument, ((long *)buffer)[i], est de type long, il a donc besoin d'un %lx.


En plus: S'il vous plaît réaliser que si buffer n'est pas long -aligned, vous obtiendrez peut-être la bonne réponse, la mauvaise réponse, ou une décharge de base, tout en fonction de votre CPU, OS, les paramètres du système d'exploitation, et/ou compilateur.

Si elle était me, je vais essayer:

long l; 
for(int i = 0; i < 20; i++) 
    printf("%p => 0x%lx\n", (void*)(&l+i), *(&l+i)); 
+1

'% p' nécessite un' void * ', cependant –

+0

Merci, @KerrekSB. –

3

Vous devez utiliser %p pour imprimer des pointeurs et ne pas oublier d'utiliser void *.

printf("%p => ??\n", (void *)&(buffer[i]), ...); 

Je ne suis pas sûr de ce que vous essayez de faire, mais si vous essayez d'interpréter une partie de buffer comme une longue et imprimer que vous pouvez utiliser %ld.

+0

Le problème n'est pas d'imprimer le pointeur, c'est déréférencer le Le deuxième argument provoque l'erreur de compilation –

+0

A quoi ça sert d'imprimer des adresses incrémentées, cependant? –

+0

@ Robᵩ Je ne suis pas vraiment sûr, mais l'avertissement a été causé par "* argument 2 *". – cnicutar