Memset не работает
Я пытаюсь использовать memset на чистом 2D-массиве, используя следующий фрагмент кода:
#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;
}
Я хочу, чтобы весь массив был инициализирован 1, используя строку:
memset (l, 1, sizeof (l));
Но я не получаю ожидаемого значения, это дает мне следующий вывод:
16843009 16843009 16843009
16843009 16843009 16843009
16843009 16843009 16843009
Я подумал, что это может быть проблема с компилятором, поэтому я попытался использовать Ideone:
Пожалуйста помоги.
3 ответа
memset
работает с байтами, поэтому он заполняет ваш массив int значениями 0x01010101 (при условии, что int равен 32 битам), что является десятичным 16843009.
Если вам нужно заполнить 2-мерный массив в стиле C числом:
int l[3][3];
std::fill_n(*l, sizeof l / sizeof **l, 1);
*l
здесь разлагается int[3][3]
в указатель на первый элемент массива (int*
), sizeof l / sizeof **l
дает количество элементов массива.
Он использует требование C++, чтобы массивы размещались непрерывно в памяти без пробелов, чтобы многомерные массивы имели такую же компоновку, что и одномерные. Например int [3][3]
имеет тот же макет, что и int[3 * 3]
,
И, в отличие от memset
, std::fill_n
работает на уровне объекта, а не на байтах. Для встроенных типов оптимизированная версия обычно указывается в виде SIMD-инструкций, не менее эффективно, чем memset
,
На самом деле, это сработало очень хорошо...
16843009
является десятичным представлением 0x01010101
(Шестнадцатеричный).
memset
сделал свою работу правильно, то есть он инициализировал каждый байт в предоставленной области памяти для 0x01
,
Если ваша цель состоит в том, чтобы установить каждый элемент массива на 1, то следующее будет делать вашу работу,
int l [3] [3] = {1,1,1,1,1,1,1,1,1};