字节数组赋值

8
byte test[4];
memset(test,0x00,4);

test[]={0xb4,0xaf,0x98,0x1a};

上述代码给我一个错误,期望在']'标记之前有主表达式。有人能告诉我这种赋值方式有什么问题吗?
4个回答

17

数组不能被赋值。你只能使用大括号进行初始化

如果你想之后“赋值”它,最接近的方法是声明另一个数组并将其复制:

const int array_size = 4;
char a[array_size] = {};  //or {0} in C.
char b[array_size] = {0xb4,0xaf,0x98,0x1a};
std::copy(b, b + array_size, a);

或者使用 std::tr1 或 boost 中的数组类:

#include <tr1/array>
#include <iostream>

int main()
{
    std::tr1::array<char, 4> a = {};

    std::tr1::array<char, 4> b = {0xb4,0xaf,0x98,0x1a};    
    a = b; //those are assignable

    for (unsigned i = 0; i != a.size(); ++i) {
        std::cout << a[i] << '\n';
    }
}

如果我使用复制来分配值,那么在if语句的限制范围内使用它会有作用域问题吗?我的意图是在所有函数中使用一个字节数组,但有4个其他的字节输入。当我知道我想要使用哪一个时,我就将其复制到通用字节数组中(我打算将其放在if语句中)。 - djones2010
你将会复制字节值,所以如果源数组的范围较小也没有问题。 - UncleBens
如果我想确认复制是否成功,有没有一种方法可以打印出这个字节数组的值?如何通过正确的值判断复制是否成功? - djones2010

14

Ben和Chris的意思是。

byte test[4]={0xb4,0xaf,0x98,0x1a};

如果你想在运行时执行此操作,可以使用memcpy完成任务。

byte startState[4]={0xb4,0xaf,0x98,0x1a};
byte test[4];

memcpy(test, startState, sizeof(test));

基本上,我有5个字节数组,我想根据一些初始数据进行选择性使用。所以,我考虑设置一个数组,然后在其中放入永远不会改变的值,我猜我也会在其上放置const,因为它永远不会改变。 - djones2010

8
除了@Chris Lutz的正确答案之外:
byte test[]={0xb4,0xaf,0x98,0x1a};

请注意,除非您想要的数组长度大于括号之间的元素数量,否则在这种情况下您不需要显式地指定数组大小。
这仅适用于在声明数组时初始化数组。否则,您必须使用您喜欢的技术(循环、STL算法等)显式地初始化每个数组元素。

还要注意,您可以使用以下代码自动确定数组大小:size_t numTestElems = sizeof(test) / sizeof(byte); - Mike DeSimone
2
@Mike - 或者,既然这是C++,可以使用template <class T, size_t N> size_t array_size(T (&n)[N]) { return N; }作为size_t numTestElems = array_size(test); - Chris Lutz
2
@Mike:我会选择使用 sizeof(test) / sizeof(test[0])。这样你就不用担心潜在的类型混淆问题了。 - Void
@Chris:我以前从没见过这个(可惜了:))。非常棒! - Void

4
除了@UncleBens的正确答案,我想指出这一点:
byte test[4];
memset(test,0x00,4);

可以缩短为:

byte test[4] = { 0 };

这是您正在尝试使用的初始化语法。语言将使用0填充未分配的空间,因此您不必编写{ 0, 0, 0, 0 }(如果数组长度稍后更改,您也不必添加更多内容)。

1
可以进一步缩短为byte test[4] = {};,但我也喜欢使用{0}。 - John Dibling
1
@John - 可以,但只能在C++中。在C语言中(这是我主要使用的语言),你必须至少有一个值。 - Chris Lutz
byte test[4] = { 0 }; 总是让我想到花括号中的内容会被分配给所有元素(就像C++中的std::vector构造函数之一)。 - Mike DeSimone
2
@Mike:不,你只是在指定第一个元素。所有剩余的元素都将被值初始化,这意味着在此情况下设置为0。 - John Dibling

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接