如何在C中转储任意结构?

我不知道要去哪个方向,也许reflection会有所帮助?

这是一个hex转储,尽可能通用:

struct Foo x; unsigned int i; const unsigned char * const px = (unsigned char*)&x; for (i = 0; i < sizeof(x); ++i) printf("%02X ", px[i]); 

请注意,其结果完全是实现定义的; 可能会有足够的填充,你不会知道任何印刷值是什么意思。 (他们中的大多数可能只是指向其他部分空间的指针。)

正如Etienne所说,C是一种静态类型的语言,没有reflection,所以你必须知道Foo的声明才能解释x的内容。

一旦你得到它,你想用你的文件做什么? 如果它将在以后再读回来,就像使用freadfwrite一样

 struct foo * bar; fwrite(bar,sizeof(*bar),1,stdout); ... fread(bar,sizeof(*bar),1,stdin); 

这将提供依赖于您的编译器/平台的二进制输出,只要它们保持不变就应该没问题。 从那里你也可以将文件提供给hex阅读器等,但你需要知道结构的布局来做任何有用的事情。

@Kerrek SB的答案很好用,我只是在使用void指针的函数中发布如何使用它。

 int dump(void *myStruct, long size) { unsigned int i; const unsigned char * const px = (unsigned char*)myStruct; for (i = 0; i < size; ++i) { if( i % (sizeof(int) * 8) == 0){ printf("\n%08X ", i); } else if( i % 4 == 0){ printf(" "); } printf("%02X", px[i]); } printf("\n\n"); return 0; } int main(int argc, char const *argv[]) { OneStruct data1, data2; dump(&data1, sizeof(OneStruct)); dump(&data2, sizeof(OneStruct)); return 0; }