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:

http://ideone.com/VFYUDg

Пожалуйста помоги.

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

Другие вопросы по тегам