🔖 Почему memset с целыми числами дает странные результаты?
memset — это функция для заполнения памяти значениями побайтно. Многие думают, что
memset(arr, 1, size) заполнит целые числа единицами. На самом деле это создаст странные значения, потому что memset работает с байтами, а не с типами. Вот почему нужно понимать, как она реально работает.// Плохо - пытаетесь установить целым числам значение 1
int numbers[5];
std::memset(numbers, 1, sizeof(numbers));
std::cout << numbers[0]; // Странный результат: 16843009
// Хорошо - используйте memset только для 0 и -1
int numbers[5];
std::memset(numbers, 0, sizeof(numbers)); // Все нули
// ИЛИ
std::memset(numbers, -1, sizeof(numbers)); // Все биты = 1
🔸 Основные проблемы с memset:
🔸 memset работает побайтно, не зная о типе данных
🔸 С целыми числами только 0 и -1 работают правильно, остальное — мусор
🔸 С не-POD типами (std::string, классы) приводит к краху
🔸 Лишняя единица в size параметре — выход за границы памяти
memset принимает три параметра: указатель, значение (преобразуется в byte), размер в байтах. Проблема: для int это 4 байта. Если вы хотите установить int = 1, нужно 4 раза записать байт 1, что даст 0x01010101 = 16843009, а не 1.
🔸 Практический пример:
char str[50];
std::memset(str, '*', sizeof(str)); // Работает: заполнит звездами
str[sizeof(str) - 1] = '\0';
int matrix[3][3];
std::memset(matrix, 0, sizeof(matrix)); // Работает: матрица нулей
std::memset(matrix, -1, sizeof(matrix)); // Работает: все биты = 1
// Буфер для обработки изображений
unsigned char pixels[100][100];
std::memset(pixels, 0, sizeof(pixels)); // Чёрный (0)
std::memset(pixels, 255, sizeof(pixels)); // Белый (255)
// Очистка игрового состояния
struct GameState {
int score;
int lives;
bool gameOver;
} state;
std::memset(&state, 0, sizeof(GameState)); // Работает для POD
state.lives = 3; // Затем переустанавливаете нужные значения
✅ Используйте memset для:
- Обнуления массивов и буферов (0)
- Установки всех битов в 1 (-1)
- Работы с char массивами
- Инициализации POD типов (Plain Old Data)
❌ Не делайте:
- memset с целыми числами кроме 0 и -1
- memset с std::string и классами (краш!)
- memset на не-POD структурах с конструкторами
- Ошибки в параметре size (выход за границы)
Правило: memset = только для побайтных операций. Для сложных типов используйте std::fill или конструкторы.
📎 Статья
🎙 Новости
📝 База вопросов
