I am trying to use memset on a pure 2D Array, using the following piece of code :
#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;
}
I want the whole array to be initialized by 1 using the line :
memset (l, 1, sizeof(l));
But I don't get the expected value, it gives me the following output:
16843009 16843009 16843009
16843009 16843009 16843009
16843009 16843009 16843009
Thought it might be a compiler problem, so I tried using Ideone:
Please help.
memset
works on bytes, so it fills your array of ints with 0x01010101 values (assuming int is 32 bits) which is decimal 16843009.
If you need to fill a 2-dimensional C-style array with a number:
int l[3][3];
std::fill_n(*l, sizeof l / sizeof **l, 1);
*l
here decays int[3][3]
into a pointer to the first element of the array (int*
), sizeof l / sizeof **l
yields the count of array elements.
It uses the C++ requirement that arrays be laid out contiguously in memory with no gaps, so that multi-dimensional arrays have the same layout as single-dimensional ones. E.g. int [3][3]
has the same layout as int[3 * 3]
.
And, unlike memset
, std::fill_n
operates on object level, not on bytes. For built-in types the optimized version normally inlines as SIMD instructions, not less efficient than memset
.
Actually, it worked very well ...
16843009
is the decimal representation of 0x01010101
(hex).
memset
did its job right, i.e. it initialized every byte in the provided memory area to 0x01
.
If your objective is to set each item of the array to 1 then the following will do your job,
int l[3][3] = {1,1,1,1,1,1,1,1,1};
来源:https://stackoverflow.com/questions/19707820/memset-not-working