memset可用于多字节类型和非零值

时间:2017-03-03 12:21:58

标签: c++ c arrays

我正在尝试将数组初始化为非零值:

BYTE byteArray[50];
memset(byteArray, 20, sizeof(byteArray));   // Works fine

int intArray[50];
memset(intArray, 20, sizeof(intArray));     // Does not work

现在,我只是手动初始化数组:

// Initialise array manually
for (int pos = 0; pos < 50; pos++)
    intArray[pos] = 20;

我很欣赏memset设置内存范围中的每个字节,因此这不能像多字节类型那样工作(除了请求值为0的特殊情况) 。有没有办法使用多字节类型强制memset非零值,或者是否有替代库函数?

3 个答案:

答案 0 :(得分:4)

  

有没有办法使用多字节类型强制非零值的memset

没有

  

或者是否存在等效的C库函数?

不是我知道的。相反,你可以使用一个简单的循环。

但是既然你已经标记了C ++,那么标准库中就有一个合适的函数:std::fillstd::fill_n

PS。 memset不仅适用于0.它也适用于具有相同重复字节模式的所有数字。例如~0

答案 1 :(得分:1)

在C中,您可以将数组初始化为一个值,如下所示:

#define ONE(n)   (n),
#define FIVE(n)  ONE(n) ONE(n) ONE(n) ONE(n) ONE(n)
#define TEN(n)   FIVE(n) FIVE(n)
#define FIFTY(n) TEN(n) TEN(n) TEN(n) TEN(n) TEN(n)

const int intArray [50] = { FIFTY(20) };

或者如果您希望在运行时分配它:

int intArray [50];
...
memcpy( intArray, &(int[50]){FIFTY(20)}, sizeof(intArray) );

易于维护的可变替代方案:

#define I1(n)  (n),
#define I2(n)  I1(n) I1(n)
#define I3(n)  I1(n) I1(n) I1(n)
#define I5(n)  I1(n) I1(n) I1(n) I1(n) I1(n)
#define I10(n) I5(n) I5(n)
#define I50(n) I10(n) I10(n) I10(n) I10(n) I10(n)

#define INIT_FILL_ARRAY(n, val) I##n(val)

int main (void)
{
  const int intArray[] = 
  { 
    INIT_FILL_ARRAY(5, 20) 
    INIT_FILL_ARRAY(3, 10) 
    INIT_FILL_ARRAY(2, 123)
  };

  for(size_t i=0; i<sizeof intArray/sizeof *intArray; i++)
  {
    printf("%d %d\n", i, intArray[i]);
  }
}

输出:

0 20
1 20
2 20
3 20
4 20
5 10
6 10
7 10
8 123
9 123

答案 2 :(得分:-1)

初始化数组的一种非常简单的方法:

int myArray[50] = {20};

将整个int值数组初始化为20