shi*_*nkr 6 c++ initialization memset
我试图在纯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;
}
Run Code Online (Sandbox Code Playgroud)
我希望使用该行将整个数组初始化为1:
memset(l,1,sizeof(l));
但我没有得到预期的值,它给了我以下输出:
16843009 16843009 16843009
16843009 16843009 16843009
16843009 16843009 16843009
Run Code Online (Sandbox Code Playgroud)
认为这可能是编译器问题,所以我尝试使用Ideone:
请帮忙.
Max*_*kin 19
memset 在字节上工作,因此它用0x01010101值填充你的整数数组(假设int是32位),即十进制16843009.
如果需要用数字填充二维C风格数组:
int l[3][3];
std::fill_n(*l, sizeof l / sizeof **l, 1);
Run Code Online (Sandbox Code Playgroud)
*l这里衰减int[3][3]成指向array(int*)的第一个元素的指针,sizeof l / sizeof **l产生数组元素的数量.
它使用C++要求,即数组在内存中连续布局,没有间隙,因此多维数组具有与单维数组相同的布局.例如int [3][3],布局相同int[3 * 3].
而且,不像memset,std::fill_n运行在目标水平,而不是字节.对于内置类型,优化版本通常作为SIMD指令内联,效率不低于memset.