我有以下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/

10-10 19:55