Печать переменной void * в C
Привет всем Я хочу сделать отладку с printf. Но я не знаю, как напечатать переменную "out".
Перед возвратом я хочу напечатать это значение, но его тип недействителен *.
int
hexstr2raw(char *in, void *out) {
char c;
uint32_t i = 0;
uint8_t *b = (uint8_t*) out;
while ((c = in[i]) != '\0') {
uint8_t v;
if (c >= '0' && c <= '9') {
v = c - '0';
} else if (c >= 'A' && c <= 'F') {
v = 10 + c - 'A';
} else if (c >= 'a' || c <= 'f') {
v = 10 + c - 'a';
} else {
return -1;
}
if (i%2 == 0) {
b[i/2] = (v << 4);
printf("c='%c' \t v='%u' \t b[i/2]='%u' \t i='%u'\n", c,v ,b[i/2], i);}
else {
b[i/2] |= v;
printf("c='%c' \t v='%u' \t b[i/2]='%u' \t i='%u'\n", c,v ,b[i/2], i);}
i++;
}
printf("%s\n", out);
return i;
}
Как я могу это сделать? Спасибо.
Ответы
Ответ 1
Это:
uint8_t *b = (uint8_t*) out;
означает, что out
на самом деле является указателем на uint8_t
, поэтому, возможно, вы хотите распечатать данные, которые на самом деле там. Также обратите внимание, что вам не нужно бросать из void *
в C, поэтому приведение в действие действительно бессмысленно.
Кажется, что код выполняет шестнадцатеричное преобразование в двоичное, сохраняя результаты в out
. Вы можете напечатать создаваемые байты i
, выполнив:
int j;
for(j = 0; j < i; ++j)
printf("%02x\n", ((uint8_t*) out)[j]);
Значение указателя редко бывает интересным, но вы можете распечатать его с помощью printf("%p\n", out);
. Спецификатор форматирования %p
предназначен для void *
.
Ответ 2
printf("%p\n", out);
- правильный способ печати указателя (void*)
.
Ответ 3
Спецификатор формата для печати указателей void с использованием printf
в C - %p
. То, что обычно печатается, представляет собой шестнадцатеричное представление указателя (хотя стандарт говорит просто, что это определенная реализация последовательность символов, определяющая указатель).