一个关于socket字节序的问题


#include <stdio.h>

int main() {

    union {
        short value;    // 2字节
        char bytes[sizeof(short)];  // char[2]
    } test; 

    test.value = 0x0102;
    if((test.bytes[0] == 1) && (test.bytes[1] == 2)) {
        printf("大端字节序\n");
    } else if((test.bytes[0] == 2) && (test.bytes[1] == 1)) {
        printf("小端字节序\n");
    } else {
        printf("未知\n");
    }

    printf("%s",test.bytes);

    return 0;
}

这是一个识别自己的主机是小端字节序还是大端字节序的程序,我在linux系统下编译运行,为什么最后 printf("%s",test.bytes);这行没有输出任何内容,输出结果如下:

img

另外可以麻烦大伙们解释下为什么令test的值为0x0102,bytes就自动填值了呢?

union 是个联合体,联合体类似结构体struct,区别是struct中每个成员占据相同大小的不同内存,而联合体中每个成员共享同一个内存
所以你给其中一个成员赋值,其他成员就都有值了
联合体本来就是用来做类型转换用的,最常见的用法就是把int拆成4个byte之类的
这里是把short拆成char,或者反过来把2个char合并成short
你这里想要输出,要循环数组按%d输出,不要按字符串输出
按字符串输出是将char全部按ascii码变成字符,而1和2没有对应的字符,是不可见的