Подтвердить что ты не робот

Указатель не будет работать в printf()

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

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;
    }
4b9b3361

Ответ 1

Просто нарисуйте указатель int на пустоту:

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

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

Ответ 2

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

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

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

Преобразуйте int* в void* с помощью...

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

Это работало очень хорошо для меня:

printf("Pointer address: %p.", pxy);

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