Initializing entire array with memset

三世轮回 提交于 2019-12-02 00:19:42

问题


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



来源:https://stackoverflow.com/questions/32693135/initializing-entire-array-with-memset

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!