【问题标题】:What does this print in C and how?这在 C 中打印什么以及如何打印?
【发布时间】:2014-02-11 03:20:30
【问题描述】:

我对这段代码如何打印它在 C 中的作用感到困惑。

#include <stdio.h>

void print_elements(int i) {

    int j;
    short arr[3] = {0x01,0x02,0x03};
    char * ptr = (char *)arr;
    for(j=0;j<=i;j++){
        printf("\n %x,", *(ptr+j));
    }
}

main() {
    print_elements(4);
}

打印出来:

1,
0,
2,
0,
3,

为什么输出是这样的?

一些可能有用的信息:

  1. 字节顺序是小端序
  2. 数组arr的第一个元素的地址是0x00
  3. 短是 2 个字节

【问题讨论】:

    标签: c printing output


    【解决方案1】:

    Short 占用两个字节的内存。即 0x01 存储为

    01 02 03

    您的系统是从右到左的小端序,即 1 0 2 0 3 0

    当您使用 char 指针和类型转换数组被视为 char 时,它一次遍历 1 个字节

    你的指针数组看起来像这样1 0 2 0 3 0

    所以在数组的循环中,它会按照您要求打印前四个元素的顺序打印到 3。

    【讨论】:

    • 因此,由于它存储为 01、02 和 03 并按小端排序,并且由于 01、02 和 03 中的 1 2 和 3 是最低有效位,这就是为什么它在技术上为每个位向后排序数组元素?因此打印 1,0,2,0,3。
    • 是的。每个元素一个接一个地存储在各个位置 arr[0] = 01 (MSB 首先存储 0,然后是 LSByte,即 1),因此系列 10 20 30。
    【解决方案2】:

    它正在逐字节打印数组元素。每个 short 在您的机器上都有 2 个字节,并以“小端”顺序存储(即,最低有效字节在前)。由于您已使用值 1、2、3 初始化元素,因此它按预期打印 1、0、2、0、3、0。(实际上,在您的示例中,您要求它只打印第一个5 个字节,所以最后的 0 不打印。)

    【讨论】:

    • 所以要澄清一下..它是逐字节打印的,但为什么要分别处理 0x01 中的 0 和 1 呢?它们不是 3 条目数组中的一个条目吗?
    • 它不会“分别对待它们”。 0x01 就是 1。但它存储在 2 个字节中(您机器上 short 的大小)。其中一个字节的值为 0,另一个字节的值为 1。
    • 谢谢! :D 欣赏它
    • 还有更多问题!明天有一个非常艰难的期中考试。
    【解决方案3】:

    不是最清晰的代码编写方式,但我相信作者有充分的理由。从查看 arr 开始。假设这里的 short 是 16 位有符号整数,您的 arr 数组元素如下所示:

    • 0:00|01
    • 1:00|02
    • 2:00|03

    在内存中,整个区域(以字节为单位)如下所示:00|01|00|02|00|03

    ptr 指针被设置为指向该内存区域的开始。

    接下来,您的 for 循环将循环五次 (0..1..2..3..4)。对于每次迭代,您都尝试从内存区域打印每个字节,跳过第一个区域:

    • (跳过):00
    • 0:01
    • 1:00
    • 2:02
    • 3:00
    • 4:03

    【讨论】:

    • 不。查找“小端”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-20
    • 2015-03-08
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    相关资源
    最近更新 更多