我正在尝试在纯2D阵列上使用memset,使用以下代码:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int l[3][3];
memset (l, 1, sizeof(l));
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
cout << l[i][j] << " ";
}
cout << endl;
}
return 0;
}
我希望使用以下行将整个数组初始化为:
memset(l,1,sizeof(l));
但我没有得到预期值,它给了我以下输出:
16843009 16843009 16843009
16843009 16843009 16843009
16843009 16843009 16843009
认为这可能是编译器问题,所以我尝试使用Ideone:
请帮忙。
答案 0 :(得分:17)
memset
对字节起作用,因此它用0x01010101值填充你的整数数组(假设int是32位),即十进制16843009。
如果您需要使用数字填充二维C风格数组:
int l[3][3];
std::fill_n(*l, sizeof l / sizeof **l, 1);
*l
此处将int[3][3]
衰减为指向数组第一个元素的指针(int*
),sizeof l / sizeof **l
生成数组元素的数量。
它使用C ++要求,即数组在内存中连续布局,没有间隙,因此多维数组具有与单维数组相同的布局。例如。 int [3][3]
的布局与int[3 * 3]
的布局相同。
而且,与memset
不同,std::fill_n
在对象级别上运行,而不是在字节上运行。对于内置类型,优化版本通常作为SIMD指令内联,效率不低于memset
。
答案 1 :(得分:5)
实际上,它运作得很好......
16843009
是0x01010101
(十六进制)的十进制表示。
memset
完成了它的工作,即它将提供的内存区域中的每个字节初始化为0x01
。
答案 2 :(得分:-2)
如果您的目标是将数组的每个项目设置为1,那么以下内容将完成您的工作,
int l [3] [3] = {1,1,1,1,1,1,1,1,1};