我正在尝试将数组初始化为非零值:
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
非零值,或者是否有替代库函数?
答案 0 :(得分:4)
有没有办法使用多字节类型强制非零值的memset
没有
或者是否存在等效的C库函数?
不是我知道的。相反,你可以使用一个简单的循环。
但是既然你已经标记了C ++,那么标准库中就有一个合适的函数:std::fill
或std::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