2011-03-12 11 views
35

Cuando ejecuto este código.Cómo imprimir direcciones variables en C?

#include <stdio.h> 

void moo(int a, int *b); 

int main() 
{ 
    int x; 
    int *y; 

    x = 1; 
    y = &x; 

    printf("Address of x = %d, value of x = %d\n", &x, x); 
    printf("Address of y = &d, value of y = %d, value of *y = %d\n", &y, y, *y); 
    moo(9, y); 
} 

void moo(int a, int *b) 
{ 
    printf("Address of a = %d, value of a = %d\n", &a, a); 
    printf("Address of b = %d, value of b = %d, value of *b = %d\n", &b, b, *b); 
} 

Sigo obteniendo este error en mi compilador.

/Volumes/MY USB/C Programming/Practice/addresses.c:16: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘int *’ 
/Volumes/MY USB/C Programming/Practice/addresses.c:17: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘int **’ 
/Volumes/MY USB/C Programming/Practice/addresses.c:17: warning: format ‘%d’ expects type ‘int’, but argument 3 has type ‘int *’ 
/Volumes/MY USB/C Programming/Practice/addresses.c: In function ‘moo’: 
/Volumes/MY USB/C Programming/Practice/addresses.c:23: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘int *’ 
/Volumes/MY USB/C Programming/Practice/addresses.c:24: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘int **’ 
/Volumes/MY USB/C Programming/Practice/addresses.c:24: warning: format ‘%d’ expects type ‘int’, but argument 3 has type ‘int *’ 

¿Me podría ayudar?

Gracias

blargman

+2

Dicen "advertencia", no "error". Eso significa que su programa seguirá ejecutándose. Pero arregla las advertencias según la respuesta a continuación. –

Respuesta

66

que desea utilizar para imprimir %p un puntero. A partir de la especificación:

p El argumento debe ser un puntero a void. El valor del puntero se convierte en una secuencia de caracteres de impresión, de una manera definida por la implementación.

Y no olvides el elenco, p.

printf("%p\n",(void*)&a); 
+0

eso es lo que originalmente pensé, pero el tutorial en este sitio web (http://www.cis.temple.edu/~ingargio/cis71/code/addresses.c) me dice que use% d ... está mal. – nambvarun

+2

@blargman, sí, está mal. Es posible que pueda obligar a las cosas a que funcionen mediante encasillamiento, pero dado que '% d' es para imprimir enteros con signo, probablemente no sea una buena opción. –

+0

bien, gracias. – nambvarun

5

Cuando se tiene la intención de imprimir la dirección de memoria de cualquier variable o un puntero, utilizando %d no va a hacer el trabajo y va a causar algunos errores de compilación, porque Está intentando imprimir un número en lugar de una dirección, e incluso si funciona, tendría un error intencionado, porque una dirección de memoria no es un número. el valor 0xbfc0d878 seguramente no es un número, sino una dirección.

Lo que debe usar es %p. por ejemplo,

#include<stdio.h> 

int main(void) { 

    int a; 
    a = 5; 
    printf("The memory address of a is: %p\n", (void*) &a); 
    return 0; 
} 

¡Buena suerte!

+2

El valor '0xbfc0d878' * es * un número. '(void *) 0xbfc0d878' no lo es. Y '% p' es probable que use una representación legible por humanos que se parece a un número (generalmente hexadecimal), pero eso no significa que los punteros sean números. (Por cierto, la pregunta fue respondida hace más de 2 años). –

0

Un código simple que imprime direcciones de variables y sus valores & también cómo imprimir direcciones o valores variables de diferentes maneras utilizando punteros.

#include<stdio.h> 
#include<conio.h> 
void main() 
{ 
    int i=3; 
    int*j,**k; 
    clrscr(); 
    j=&i; 
    k=&j; 
    printf("\nAddress of i=%u",j); 
    printf("\nAddress of i=%u",*k); 
    printf("\nAddress of i=%u",i); 
    printf("\nAddress of j=%u",&j); 
    printf("\nAddress of j=%u",&k); 
    printf("\nAddress of j=%u",k); 
    printf("\nAddress of i=%d",i); 
    printf("\nAddress of i=%d",*j); 
    printf("\nAddress of i=%d",**k); 
    printf("\nAddress of j=%u",i); 
    printf("\nAddress of j=%u",*k); 
    printf("\nAddress of k=%u",k); 
    getch(); 
} 

Hope you Understand.

Cuestiones relacionadas