【问题标题】:Declaring and initializing char array in C++在 C++ 中声明和初始化 char 数组
【发布时间】:2021-04-15 01:48:17
【问题描述】:

我正在尝试在 if else 块中声明和初始化一个 unsigned char arr,但我看到“无法在赋值中将 '' 转换为 'unsigned char'”错误。谁能帮我理解这有什么问题?我是 C++ 新手。

已编辑:

unsigned char arr[4]; 
if (..){
    arr[4] = {0x0F, 0x0F, 0x0F, 0x0F};
} else {
    arr[4] = {0xFF, 0xFF, 0xFF, 0xFF};
}

走下面的路没有任何问题。但是我需要在 if-else 中进行分配,所以我想了解上面的 sn-p 有什么问题?

unsigned char arr[4] = {0xFF, 0xFF, 0xFF, 0xFF};

【问题讨论】:

  • 一方面,那是unsigned 而不是usigned,然后值周围的大括号是错误的。
  • OT:arr[8] = {0XCF}; 越界。法定指数为 0 .. 7
  • 您可能想使用std::array<uint8_t,8> arr; 而不是unsigned char arr[8];
  • 转换为 unsigned char 是你的程序中最少的,在这里。 char arr[8]={ ... } 是声明和初始化。但是arr[8]=something,无论“...”为数组的第九个元素赋值,就像arr[0]=something 为数组中的第一个元素赋值一样。当然,问题在于八元素数组中没有第九个元素。任何这样做的尝试都会导致demons flying out of your nose。如果你不想让恶魔从你的鼻子里飞出来,你不应该这样做。
  • 在声明变量 (arr) 之后,您对它所做的任何其他操作都不再是初始化。

标签: c++ arrays char initializer list-initialization


【解决方案1】:

恐怕您尝试使用的初始化器语法仅适用于变量声明。

可能的解决方案是声明一个新数组并使用 memcpy 复制它

#include <iostream>
#include <cstring>

int main()
{
    unsigned char arr[4] =  {0x0F, 0x0F, 0x0F, 0x0F};
    if (elsecondition){
        unsigned char arr1[4] = {0xFF, 0xFF, 0xFF, 0xFF};
        memcpy(arr, arr1, sizeof(arr));
    }
return 0;
}

或者一次分配一个元素

#include <iostream>

int main()
{
    unsigned char arr[4] =  {0x0F, 0x0F, 0x0F, 0x0F};
    if (elsecondition){
        // we can use a loop, since all values are identical
        for (int i = 0; i < sizeof(arr); ++i)
            arr[i] = 0xFF;
    }
return 0;
}

【讨论】:

    【解决方案2】:

    首先: arr[4] = {0x0F, 0x0F, 0x0F, 0x0F}; 将尝试为数组的第 5 个元素分配一些东西(但类型不兼容,这将是越界访问)。

    此语法仅在数组初始化中可用,但 std::array 重载 operator= 并支持您想要的:

    std::array<unsigned char, 4> arr; 
    if (...){
        arr = {0x0F, 0x0F, 0x0F, 0x0F};
    } else {
        arr = {0xFF, 0xFF, 0xFF, 0xFF};
    }
    

    【讨论】:

      猜你喜欢
      • 2016-09-26
      • 1970-01-01
      • 1970-01-01
      • 2011-03-06
      • 2018-05-20
      • 1970-01-01
      • 2011-06-26
      • 1970-01-01
      • 2017-05-02
      相关资源
      最近更新 更多