为什么C编译器在05年和07年的情况下会给出这些结果?

问题描述 投票:0回答:1

我对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
c pointers
1个回答
2
投票

显然,这一切都取决于编译器,但在你的例子中,明显的值被截断了。

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

所有这些都取决于编译器

© www.soinside.com 2019 - 2024. All rights reserved.