0

我有一个大小为 64 的 unsigned char 数组,我想在运行时更改它的值,但是我所有的尝试都失败了,我做错了什么?

int main() {
  unsigned char buffer[64]={0xef,0xaa,0x03,0x05,0x05,0x06,0x07,0x08,......};
  buffer = {0x01,0x04,0xa0,0xb0,0xde,0x00,.....}; //fails

  return 0;
}

编辑:我不想用零填充数组缓冲区,我想放置一个新值

4

8 回答 8

9

另一种解决方案是使用全能memcpy()和 C99 复合文字:

memcpy(array, (int []){ 0x00, 0x01, 0x02 }, sizeof array);

信不信由你,这行得通

于 2013-08-15T19:11:44.383 回答
4
    for (int i = 0; i < 64; ++i) buffer[i] = 0x00;

或在 C++(11 或更高版本)中,您可以使用 std::fill_n 或 std::generate_n

     std::fill_n(buffer, 64, 0x00);

或者

      for (auto &b : buffer) b = 0x00;
于 2013-08-15T19:08:03.617 回答
2

从您的评论中,我看到您不想访问数组的元素。如果没有,那么这是您问题的另一种解决方案。

您可以在内存池上声明缓冲区。因此,

unsigned char *buffer = malloc( sizeof( unsigned char ) * 64 );

...然后,如果您想替换数组的所有元素(就像您尝试使用数组初始化语法所做的那样),可以按如下方式完成:

memset( buffer, 0x00, sizeof( unsigned char ) * 64 ); // To replace buffer = { 0x00, ..., 0x00 };.
memset( buffer, 0, sizeof( unsigned char ) * 64 ); // To replace buffer = '0...0';.

遗产:

如果您想使用在堆栈上声明的数组,那么您需要使用方括号一次改变一个元素[ ]。将按如下方式完成:

for ( int i = 0; i < 64; i++ ) {
  buffer[ i ] = val; // where "val" is some value.
}
于 2013-08-15T19:07:09.203 回答
1

使用std::memset

memset(buffer, 0, sizeof(buffer));

还有bzero,但它是一个遗留功能,因此不应在新开发中使用它。

于 2013-08-15T19:08:57.763 回答
1

您可以通过两种方式更改元素的值:

unsigned char buffer[64]={0xef,0xaa,0x03,0x05,0x05,0x06,0x07,0x08,......};

buffer[0] = 0;
buffer[1] = 15;
// etc ...

// C++11 for-loop range works fine to :
for ( auto &c : buffer )
    c = 0;

或者之后,您可以使用类似 : memset, std::fill_n:的功能

memset( buffer, 0, sizeof(buffer) );
std::fill_n( buffer, 64, 0x00 );
于 2013-08-15T19:09:40.307 回答
0

由于这是一些编译器问题,请尝试简单地使用memcpy().

#include <string.h>
int main() {
  unsigned char bufferTo[  64]={0xef,0xaa,0x03,0x05,0x05,0x06,0x07,0x08,......};
  unsigned char bufferFrom[64]={0x01,0x04,0xa0,0xb0,0xde,0x00,.....};
  memcpy(bufferTo, bufferFrom, 64);
  return 0;
}
于 2013-08-16T02:21:29.213 回答
0

你可以使用snprintf

#include <stdio.h>

int main() {
  unsigned char buffer[64]={0};
  snprintf(buffer, 64, "Hello World!\x0D\x0A");
  printf(buffer);
}

输出:

$ ./a.out | hexdump -C
00000000  48 65 6c 6c 6f 20 57 6f  72 6c 64 21 0d 0a        |Hello World!..|
0000000e
于 2013-08-15T19:16:48.023 回答
0

尽管语法相似,但初始化和赋值是两种不同的操作。

int x[4] = { 1, 2, 3, 4}; // initialization
x = { 1, 2, 3, 4}; // assignment

此外,C 和 C++ 中的原始数组的行为很奇怪,特别是有一条特殊规则说它们是不可赋值的:

int x[4];
int y[4];

y = x; // error, arrays are not assignable

因此,即使您创建了一个数组临时对象,也不能简单地使用赋值运算符将其复制到另一个数组对象中。

相反,如果您设置使用原始数组,则必须单独设置每个数组元素,使用memcpy,fill等。


更好的解决方案是使用 C++ 和允许赋值的原始数组以外的类型,例如std::array<unsigned char, 64>

std::array<unsigned char, 64> buffer = {0xef,0xaa,0x03,0x05,0x05,0x06,0x07,0x08};
buffer = {}; // zeros out the array

模板的std::array行为通常与普通对象一致,而 C 和 C++ 中的原始数组在语言规范中具有所有这些非常奇怪的行为和特殊情况。您应该避免使用原始数组。


不幸的是,C 没有任何替代原始数组的方法。

于 2013-08-15T19:17:10.980 回答