简体   繁体   中英

Initializing entire array with memset

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;
    }

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.

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, eg 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.

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.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM