Я хочу сделать что-то довольно простое. Я получаю результаты, но проблема в том, что у меня нет возможности узнать, верны ли результаты.
Я работаю на C, и у меня есть два указателя; Я хочу распечатать содержимое указателя. Я не хочу разыменовать указатель, чтобы получить указанное значение, мне просто нужен адрес, который сохранил указатель.
Я написал следующий код, и мне нужно знать, правильный ли он, а если нет, то как его исправить.
/* item one is a parameter and it comes in as: const void* item1 */
const Emp* emp1 = (const Emp*) item1;
printf("\n comp1-> emp1 = %p; item1 = %p \n", emp1, item1 );
Пока я публикую это (и причина, по которой это важно), заключается в том, что мне в конечном итоге нужно сделать это для указателя на указатель. То есть:
const Emp** emp1 = (const Emp**) item1;
c
pointers
memory-address
Франк V
источник
источник
Ответы:
То, что у вас есть, правильно. Конечно, вы увидите, что emp1 и item1 имеют одинаковое значение указателя.
источник
Чтобы напечатать адрес в указателе на указатель:
printf("%p",emp1)
разыменовать один раз и вывести второй адрес:
printf("%p",*emp1)
Вы всегда можете проверить с помощью отладчика, если вы используете Linux
ddd
и отображаете память или простоgdb
, вы увидите адрес памяти, чтобы вы могли сравнить со значениями в ваших указателях.источник
Думаю, это было бы наиболее правильно.
printf("%p", (void *)emp1); printf("%p", (void *)*emp1);
printf()
является вариативной функцией, и ей должны передаваться аргументы правильного типа. Стандарт говорит, что%p
беретvoid *
.источник
void *
действительно требуется.Поскольку вы, кажется, уже решили отображение адреса базового указателя, вот как вы можете проверить адрес двойного указателя:
char **a; char *b; char c = 'H'; b = &c; a = &b;
Вы сможете получить доступ к адресу двойного указателя
a
, выполнив:printf("a points at this memory location: %p", a); printf("which points at this other memory location: %p", *a);
источник
printf("which contains this value: %c\n" **a);
просто хотел добавить это ^. ^.char c = 'A'; printf("ptr: %p,\t value: %c,\t and also address: %zu",&c, c,&c);
результат:
источник
Я был в этом положении, особенно с новым оборудованием. Я предлагаю вам написать небольшую подпрограмму дампа в шестнадцатеричном формате. Вы сможете увидеть все данные и адреса, по которым они находятся. Это хорошая практика и вселяет уверенность.
источник