我对05年和07年的情况难以理解。为什么会打印出12A,和1?
struct s {short s; char c; int i;};
struct s s1={0x333231, 0501, -2};
printf("01:%o\n", sizeof(s1));
printf("02:%x\n", s1.s);
printf("03:%x\n", s1.c);
printf("04:%x\n", s1.i);
printf("05:%s\n", (char*)&s1); //12A
printf("06:%d\n", sizeof((char*)&s1));
printf("07:%c\n", *(char*)&s1); //1
显然,这一切都取决于编译器,但在你的例子中,明显的值被截断了。
struct s s1={0x3231, 65, -2};
printf("05:%s\n", (char*)&s1); //12A
有 short
16位上。char
8位,而你明显是在小恩迪安,所以字节从 &s
是......0x31、0x32和65,分别对应ASCII码中的'1'、'2'和'A'。0x31、0x32和65,分别对应ASCII码中的'1'、'2'和'A'。
字符串后面的0来自于一个填充物,你有 "机会 "在里面有0。
printf("07:%c\n", *(char*)&s1); //1
出于同样的原因,"字符串 "的第一个字符是 "1
所有这些都取决于编译器