Как напечатать переменные адреса в C? - PullRequest
42 голосов
/ 13 марта 2011

Когда я запускаю этот код.

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

Я продолжаю получать эту ошибку в моем компиляторе.

/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 *’

Не могли бы вы мне помочь?

Спасибо

blargman

Ответы [ 4 ]

83 голосов
/ 13 марта 2011

Вы хотите использовать %p для печати указателя. Из спецификации:

p Аргументом должен быть указатель на void. Значение указателя преобразуется в последовательность печатных символов способом, определяемым реализацией.

И не забывайте актерский состав, например

printf("%p\n",(void*)&a);
6 голосов
/ 13 июня 2013

Когда вы намереваетесь напечатать адрес памяти любой переменной или указателя, использование %d не сделает работу и вызовет некоторые ошибки компиляции, потому что вы пытаетесь распечатать число вместо адреса, и даже если это сработает, у вас возникнет преднамеренная ошибка, поскольку адрес памяти не является числом. значение 0xbfc0d878, безусловно, не число, а адрес.

То, что вы должны использовать, это %p. например.,

#include<stdio.h>

int main(void) {

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

Удачи!

1 голос
/ 20 марта 2018

Чтобы напечатать адрес переменной, вам нужно использовать формат %p. %d для целых чисел со знаком. Например:

#include<stdio.h>

void main(void)
{
  int a;

  printf("Address is %p:",&a);
}
0 голосов
/ 13 марта 2011

Похоже, вы используете% p: Печать указателей

...