Печать необработанных данных в шестнадцатеричном виде из структуры, содержащей указатели - PullRequest
0 голосов
/ 10 мая 2018

Как своеобразное продолжение вопроса печати необработанных шестнадцатеричных данных из структуры: Printf необработанных данных с шестнадцатеричным выводом фиксированной длины

У меня есть структура, которая содержит указатели на другие данные. Есть ли простой способ напечатать эту структуру и содержимое указателей в виде необработанных шестнадцатеричных значений в одном непрерывном потоке? При печати шестнадцатеричных значений B ниже используется:

// @note not actually valid code
struct B myStruct;
struct A myOtherStruct;
myStruct.c = &myOtherStruct;
unsigned char * p = (unsigned char *)myStruct;

for(int i = 0; i < sizeof(struct B) + sizeof(struct A); i++) // 
  printf("%02x ", p[i]);

Естественно, я получаю адрес только по адресу myStruct.c (потому что, как я полагаю, это именно то, что есть).

struct A
{
  int a;
  char b;
};
struct B
{
  int a;
  char b;
  void * c; // usually a struct A, ignore type-safety for simplicity 
};

Я попытался вручную освободить место для данных в struct B с помощью malloc и скопировать struct A, но, похоже, не сработал. Пытаясь сделать это из любопытства.

1 Ответ

0 голосов
/ 10 мая 2018

Когда вы зацикливаетесь на struct B и печатаете void * c, вы печатаете значение указателя (то есть адрес памяти).

Следовательно, либо вы встраиваете struct A непосредственно в struct B (вместо указателя); или код печати написан так, что он знает о указателе, разыменовывает его и печатает это (вам нужно знать, насколько большой объем памяти - поскольку вы говорите // usually a struct A, давайте предположим, что программа знает; в противном случае вам нужно сохранить то, что есть, или хотя бы его размер).

...