gpt4 book ai didi

c - 如何在 C 中以表示其内容的位打印结构对象?

转载 作者:太空宇宙 更新时间:2023-11-04 06:01:30 26 4
gpt4 key购买 nike

我有以下c程序

     struct in_addr {
unsigned long s_addr; // load with inet_aton()
};

struct sockaddr_in {
short a;
unsigned short b;
struct in_addr c;
char d[8];
};

int main(int argc, char** argv) {

struct sockaddr_in *record1;
record1 = (struct sockaddr_in*)malloc(sizeof(struct sockaddr_in*));
memset(record1, 0, 14);
record1->a = 16;
record1->b = 4;
//strcpy(record1->sin_zero, "1");
printf("Struct record1: %x", *record1);
}

当我单独分配 record1->a = 16 时,我得到“Struct record1: 10

当我分配 record1->a = 16record1->b =4 时,我得到“Struct record1:40010”(我发现它是 Little Endianness,但仍然*我的预期输出是 04 10*(short 每个需要两个字节))

当我分配 record1->a=16; *record1->b =4;* record1->c.s_addr = 1UL; *strcpy(record1->d, "1");* 输出仍然是“Struct record1: 40010”(Y 是对 long 和 char[] 的赋值没有反射(reflect)出来?)

任何人都可以解释这种行为。 我想看看结构体的内容在内存中是如何分配的。有没有更聪明的方法来实现这一目标?

最佳答案

您正在为指针的大小分配空间,而不是 struct sockaddr_in 的大小。因此,您超出了分配边界并陷入未定义的行为。

尝试:

record1 = malloc(sizeof(*record));

其次,如果你想打印短片,那就打印短片。我有点震惊你的 printf 甚至 works ,考虑到你正在发送一个指针取消引用(即 struct-val)作为 hex-int 打印。如果您尝试打印字节,您需要一个枚举算法来执行此操作。

unsigned char *p = (unsigned char*)record1;
for (size_t i=0; i<sizeof(*record1); ++i)
printf("%.2x ", p[i]);

就是您可以做到的一种方式。使用您发布的 main() 中的设置会产生:

10 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 

这当然是有道理的。 a 是 16,两字节 short 中的 little-endian 确实是 10 00。同样,b 是 4,同样,一个两字节无符号短整型,相同的小端,是 04 00

关于c - 如何在 C 中以表示其内容的位打印结构对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18953046/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com