我有以下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=16和record1->b=4时,我得到“Struct record1:40010”(我可以发现它有点尾数,但仍然*我的预期输出是0410*(short需要每个字节两个字节)
当我分配record1->a=16;*record1->b=4;*record1->c.s\u addr=1UL;*strcpy(record1->d,“1”)时*
输出仍然是“Struct record1:40010”(Y是long的赋值,char[]没有反映出来?)
有人能解释一下这种行为吗。我想看看结构的内容是如何在内存中分配的。有没有更聪明的方法来实现这个目标?
最佳答案
您分配的空间是指针的大小,而不是struct sockaddr_in
的大小。因此,你超出了分配的界限,进入了不确定的行为。
尝试:
record1 = malloc(sizeof(*record));
其次,如果你想打印一个短,然后打印短。我有点震惊你的printf甚至可以工作,考虑到你正在发送一个指针解引用(即一个结构值)打印为十六进制整数。如果你想打印字节,你需要一个枚举算法来完成。
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,两个字节短的小尾数确实是10 00
。同样地b
是4,同样是一个两字节无符号短的小尾数,也是04 00
。关于c - 如何用代表C内容的位打印结构对象?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18953046/