2015-08-11 4 views
3

Ниже приведены мой сниппет:Распечатайте значения uint8_t *

typedef struct{ 
    uint8_t dstEndpt; 
    uint16_t srcEndpt; 
    uint8_t * quality; 
} DataIndT; 

DataIndT * dataIndPtr; 

printf("dstEndpt: 0x%02x", dataIndPtr->dstEndpt); <-- print out the value of dstEndpt 

printf("dstEndpt: 0x%04x", dataIndPtr->srcEndpt); <-- print out the value of srcEndpt 

Однако, как я могу распечатать значение quality?

+0

'quality' является указателем как массив, если вы хотите, чтобы напечатать значение, которое указывает вам нужно указать. с индексом или разыменованием. – wallek876

+0

@ wallek876, не могли бы вы показать пример? – user3815726

+0

@ user3815726 'качество [0]' или '* качество' он имел в виду. – ameyCU

ответ

3

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

printf("quality: %d", *(dataIndPtr->quality)); 

Используя нулевой индекс, как если бы это был массив должен также напечатать значение:

printf("quality: %d", dataIndPtr->quality[0]); 

Или, если то, что вы хотите распечатать значение самого указателя то ответ Михала - это то, что вы хотите.

+0

% x не является правильным спецификатором печати для uint8_t. – this

+0

@ это да, ты прав, я не заметил, что просто скопировал вопрос, я его обновлю. – wallek876

+2

@ это это * a * правильный спецификатор. Без повторения наших последних обсуждений '% x' может использоваться для неотрицательных значений любого типа, более узкого, чем' int', потому что они подвергаются рекламным акциям по умолчанию. На практике это хороший выбор, потому что некоторые библиотеки не поддерживают модификаторы, добавленные в C99 –

3

Чтобы напечатать значение указателя, используйте %p:

printf("dstEndpt: %p", (void*)dataIndPtr->quality); 
+0

'% p' используется для адреса указателя, а не значения. – ameyCU

+0

@ameyCU Он печатает значение указателя. – Quentin

+0

% p может печатать указатели только на недействительные. – this

3

Однако, как я могу распечатать значение качества?

Вы делаете

printf("%p", (void*) dataIndPtr->quality); 

Это будет печатать адрес, так как значение указателя является адрес объекта, на который указывает указатель.


Для печати объект где указатель указывает, в этом случае, вы можете использовать спецификаторы формата, доступные для C99 (также необходимо включить inttypes.h). Конечно, вы также должны разыменования указателя:

printf("%" PRIu8 "\n", *(dataIndPtr->quality)); 

поскольку quality является указателем на uint8_t или

printf("%" PRIu16 "\n", *(dataIndPtr->srcEndpt)); 

для uint16_t типов.

1

Как @Giorgi указал, вы можете использовать inttypes.h.

Вот небольшой пример:

#include <inttypes.h> 
#include<stdio.h> 

int main(void){ 

    uint8_t a = 0; 
    uint16_t b = 0; 
    uint32_t c = 0; 
    uint64_t d = 0; 


    printf("%" PRId8 "\n", a); 
    printf("%" PRIu16 "\n",b); 
    printf("%" PRIu32 "\n", c); 
    printf("%" PRIu64 "\n", d); 

    return 0; 
} 
Смежные вопросы