我试图在纯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; }
我希望使用该行将整个数组初始化为1:
memset(l,sizeof(l));
但我没有得到预期的值,它给了我以下输出:
16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009
认为这可能是编译器问题,所以我尝试使用Ideone:
请帮忙.
解决方法
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.