【问题标题】:C initialize array in hexadecimal valuesC以十六进制值初始化数组
【发布时间】:2016-02-01 00:00:47
【问题描述】:

我想初始化一个 16 字节的十六进制值数组,尤其是 0x20(空格字符)值。

正确的方法是什么?

unsigned char a[16] = {0x20};

unsigned char a[16] = {"0x20"};

谢谢

【问题讨论】:

  • 0x2 不是空格字符,而是一个整数。
  • 我说的是十六进制的ASCII空格字符,即0x20
  • C 标准不使用 ASCII。 (刚刚注意到我错过了尾随的0;当然,我的意思是0x20)。如果您指的是空格,则应使用空格字符常量:' '

标签: c arrays string hex unsigned


【解决方案1】:

例如定义这个

unsigned char a[16] = {0x20, 0x41, 0x42, };

将如图所示初始化前三个元素,其余元素为0

你的第二种方式

unsigned char a[16] = {"0x20"};

不会做你想做的事:它只是用四个字符0x20 定义了一个以 nul 结尾的字符串,编译器不会将其视为十六进制值。

【讨论】:

  • 啊,我明白了。如果我想要 0x20 的 ASCII 值怎么办?就像我想要那个十六进制值给出的键盘空间一样。
  • @Kingamere ASCII 值 0x20(十六进制)或 32(十进制)。如果您将其打印为int,您将获得32,如果您将其打印为char,您将获得` `(空格)。
【解决方案2】:

有一个名为designated initializers 的GNU 扩展。 默认情况下使用gcc启用此功能

有了这个你可以初始化你的数组在表单中

unsigned char a[16] = {[0 ... 15] = 0x20};

【讨论】:

  • 指定初始化器不是 gcc 扩展,而是标准 C。允许范围是扩展,但是是..
【解决方案3】:
unsigned char a[16] = {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20};

unsigned char a[16] = "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20";

【讨论】:

    【解决方案4】:

    第一种方法是正确的,但是你需要重复0x20, 十六次。你也可以这样做:

    unsigned char a[16] = "                ";
    

    【讨论】:

    • 此解决方案将导致未定义的行为! "<16 spaces>" 实际上会占用 17 个字节(最后一个为 '\0')。
    • @AlexLop。否定的,C 规范允许使用与数组大小相同的字符串文字来初始化字符数组。在这种情况下,NUL 终止符将被删除。
    • 能否请您指出支持您声明的文档?
    • 第 6.7.9 节第 14 段,其中说(强调添加):“字符串文字的连续字节(包括终止空字符 如果有空间 或如果数组的大小未知)初始化数组的元素。"
    • 你是对的,我的错。您能否在您的答案中稍作修改,以便我可以“撤消”否决票?
    【解决方案5】:

    我不知道这是否是你要找的,但是如果给定数组的大小会改变(经常或不改变),为了更容易维护你可以考虑以下基于 的方法memset()

    #include <string.h>
    
    #define NUM_OF_CHARS 16
    
    int main()
    {
        unsigned char a[NUM_OF_CHARS];
    
        // initialization of the array a with 0x20 for any value of NUM_OF_CHARS
        memset(a, 0x20, sizeof(a));
    
        ....
    }
    

    【讨论】:

      【解决方案6】:

      我会使用memset

      无需输入任何内容,数组的大小仅在初始化时提供一次。

      #include <string.h>
      
      int main(void)
      {
        unsigned char b[16];
        memset(b, 0x20, sizeof(b));
      }
      

      【讨论】:

        猜你喜欢
        • 2014-11-13
        • 2013-07-22
        • 1970-01-01
        • 2013-11-25
        • 2013-11-11
        • 2015-05-24
        • 1970-01-01
        • 2012-03-03
        相关资源
        最近更新 更多