繁体   English   中英

Output 使用 char* 打印 int 数组的内容

[英]Output from printing the contents of an int array by using a char*

你知道为什么下面程序的output是

1000
2000

如果你能帮助我,我将不胜感激。 这是程序。

int main()
{
    int t[] = { 1, 2 };
    char* p = (char*)t;
    int i;
    for (i = 0; i < sizeof(t); i++)
    {
        printf("%d", *(p + i));

        if (i % sizeof(t[0]) == sizeof(t[0]) - 1) printf("\n");
    }
    return 0;
}

它将t的值中每个字节的值打印为数值。 最后的if语句看起来很混乱,但只是检查它是否在最后一个元素然后在退出前添加一个换行符。 这是以更易读的形式重写的代码。

int main() {
    int t[] = { 1, 2 };

    // Get a pointer to he first byte in t
    char* p = (char*)t;

    // Go through each byte in t
    for (int i = 0; i < sizeof(t); i++) {
        // Print the numerical value of each byte
        printf("%d", p[i]);
    }

    // Add a line break when finished.
    printf("\n");

    return 0;
}

此代码的目的很可能是显示您使用的是大端还是小端 从您的 output 我们可以知道您正在使用小端。 如果它是大端,它会输出00010002

您可以通过将 printf 更改为printf("%d ", p[i]);来澄清一下。 .

代码所做的是逐字节遍历int数组。 C 中的一条特殊规则允许我们通过使用指向字符类型的指针然后访问各个字节来检查几乎任何类型的原始数据。

然而, char是一个非常糟糕的选择,因为Is char signed or unsigned by default? . 请改用unsigned charuint8_t

至于为什么值为1int的原始字节表示出现为1 0 0 0 ,这是因为您的系统恰好是 32 位int little endian 系统。 什么是 CPU 字节顺序?

if (i % sizeof(t[0]) == sizeof(t[0]) - 1) printf("\n"); 部分只是在 4 个字节后打印新行。

程序的完整重写可能如下所示:

#include <stdio.h>

int main (void)
{
  int t[] = { 1, 2 };
  const size_t t_items = sizeof(t)/sizeof(*t); // 8/4 = 2 items
  unsigned char* p = (unsigned char*)t; // bug fix to make the code portable

  for (size_t i = 0; i<t_items; i++) // iterate across array items
  {
    for(size_t j=0; j<sizeof(int); j++) // iterate across the bytes of each int
    {
      printf("%d ", *p);
      p++;
    }
    printf("\n");
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM