2015-09-21 2 views
3

Я инициализировал весь массив со значением 1, но на выходе отображается некоторое количество мусора. Но эта программа работает правильно, если я использую 0 или -1 вместо 1. Так что есть некоторые ограничения на то, какие типы значений могут быть инициализированы с использованием memset.Инициализация всего массива с memset

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

yup it работает с -1. вы можете попробовать. –

+0

Вы должны сначала выяснить, что делает 'sizeof (a)', а затем вы должны выяснить, что является типом третьего аргумента 'memset()'. Это должно очистить его. PS. Не делайте этого на C++, это не нужно, и, как видите, ** неправильно **. –

+1

Если у вас современный компилятор, вы можете попробовать: std :: fill (std :: begin (a), std :: end (a), 1); ' –

ответ

1

MemSet заполняет байты, из cppreference:

Преобразует значение ч в неподписанные символ и копирует его в каждый из первых количества символов объекта, на который указывает Dest.

Ваш int принимает несколько байтов, например. 32-битный int будет заполнен 1,1,1,1 (в базе 256, endianess в данном случае не имеет значения), который затем ложно интерпретируется как значение «мусора».

+1

В частности, '0x01010101', который вы будете формировать в каждом' a', является '16843009' десятичным числом, которое, как я предсказываю, является значением« мусора », которое вы видите. '-1'« работает »(для неправильного определения« works »), потому что он заполняет память массива 0xff, а 0xffffffff - это 32-разрядное представление' -1'. – TripeHound

-1

memset - это операция, которая устанавливает бит.

Если вы хотите установить значение, используйте цикл for.

Рассмотрим 4-битового целого числа:

Его значение равно 1, когда биты 0001, но MemSet устанавливает его в 1111

2

MemSet, как и другие говорят, устанавливает каждый байт массива на указанное значение.

Причина это работает с 0 и -1, потому что оба используют один и тот же повторяющийся узор на произвольных размеров:

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

так заполняя область памяти с 0xff будет эффективно заполнить массив с -1.

Однако, если вы заполняете его 1, вы устанавливаете каждый байт на 0x01; следовательно, это будет то же самое, что установка каждого целого числа на значение 0x01010101, что очень маловероятно, что вы хотите.

1

Другие ответы объяснили уже std::memset. Но лучше избегать таких низкоуровневых функций и программ на более высоком уровне. Так просто использовать стандартную библиотеку и его C++ 11 std::array

#include <array> 

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

Или, если вы предпочитаете массивы C-стиле, по-прежнему использовать стандартную библиотеку с алгоритмом std::fill, как указано @BoPersson

#include <algorithm> 
#include <iterator> 

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

В большинстве реализаций обе версии будут звонить std::memset, если это безопасно.

+1

маленькая опечатка, должна быть std :: end (a) – karsten

+0

@karsten tnx, fixed – TemplateRex

Смежные вопросы