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
работает на байтах, поэтому он заполняет ваш массив 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};