Initializing entire array with memset

2020-04-07 19:45发布

问题:

I have initialised the entire array with value 1 but the output is showing some garbage value. But this program works correctly if i use 0 or -1 in place of 1. So are there some restrictions on what type of values can be initialised using memset.

 int main(){
    int a[100];
    memset(a,1,sizeof(a));
    cout<<a[5]<<endl;
    return 0;
    }

回答1:

memset, as the other say, sets every byte of the array at the specified value.

The reason this works with 0 and -1 is because both use the same repeating pattern on arbitrary sizes:

(int) -1 is 0xffffffff
(char) -1 is 0xff

so filling a memory region with 0xff will effectively fill the array with -1.

However, if you're filling it with 1, you are setting every byte to 0x01; hence, it would be the same as setting every integer to the value 0x01010101, which is very unlikely what you want.



回答2:

Memset fills bytes, from cppreference:

Converts the value ch to unsigned char and copies it into each of the first count characters of the object pointed to by dest.

Your int takes several bytes, e.g. a 32bit int will be filled with 1,1,1,1 (in base 256, endianess doesn't matter in this case), which you then falsly interpreted as a "garbage" value.



回答3:

The other answers have explained std::memset already. But it's best to avoid such low level features and program at a higher level. So just use the Standard Library and its C++11 std::array

#include <array>

std::array<int, 100> a;
a.fill(1);

Or if you prefer C-style arrays, still use the Standard Library with the std::fill algorithm as indicated by @BoPersson

#include <algorithm>
#include <iterator>

int a[100];
std::fill(std::begin(a), std::end(a), 1);

In most implementations, both versions will call std::memset if it is safe to do so.



回答4:

memset is an operation that sets bits.

If you want to set a value use a for-loop.

Consider a 4-bit-integer:

Its value is 1 when the bits are 0001 but memset sets it to 1111