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 работает на байтах, поэтому он заполняет ваш массив ints значениями 0x0101010101 (предполагая, что 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 (hex).

memset сделал свою работу, т. е. инициализации каждого байта в пространстве памяти 0x01.


Если ваша цель состоит в том, чтобы установить каждый элемент массива в 1, то следующее сделает вашу работу,

int l[3][3] = {1,1,1,1,1,1,1,1,1};