Указатель не будет работать в printf () - PullRequest
31 голосов
/ 24 марта 2011

Возникла проблема с печатью указателя. Каждый раз, когда я пытаюсь скомпилировать программу ниже, я получаю следующую ошибку:

pointers.c:11: warning: format ‘%p’ expects type ‘void *’, but argument 2 has type ‘int *’

Я явно упускаю что-то простое здесь, но из других примеров похожего кода, которые я видел, это должно работать.

Вот код, любая помощь будет отличной!

#include <stdio.h>

    int main(void)
    {
       int x = 99;
       int *pt1;

       pt1 = &x;

       printf("Value at p1: %d\n", *pt1);
       printf("Address of p1: %p\n", pt1);

       return 0;
    }

Ответы [ 4 ]

45 голосов
/ 24 марта 2011

Просто приведите свой int-указатель к пустому:

printf( "Address of p1: %p\n", ( void * )pt1 );

Ваш код безопасен, но вы компилируете с флагом предупреждения -Wformat, который напечатает проверку вызовов на printf() иscanf().

10 голосов
/ 24 марта 2011

Обратите внимание, что вы получаете простое предупреждение. Ваш код будет , вероятно, выполняться должным образом.

Спецификатор преобразования "%p" в printf ожидает аргумент void*; pt1 имеет тип int*.

Предупреждение является хорошим, потому что int* и void* могут, в странных реализациях, иметь разные размеры или битовые комбинации или что-то .

Преобразование int* в void* с использованием заклинания ...

printf("%p\n", (void*)pt1);

... и все будет хорошо, даже на странных реализациях.

2 голосов
/ 24 марта 2011

В этом случае компилятор немного перегружен предупреждениями. Ваш код совершенно безопасен, вы можете при желании удалить предупреждение с помощью:

printf("Address of p1: %p\n", (void *) pt1);
1 голос
/ 24 марта 2011

Сообщение говорит само за себя, но это просто предупреждение, а не ошибка как таковая:

printf("Address of p1: %p\n", (void*)pt1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...