TGViewer
YeaHub Tech YeaHub Tech @yeahub_tech · 412 subscribers
Post #302 66
#C++

🔖 Почему 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 или конструкторы.


📎 Статья

🎙 Новости

📝 База вопросов
  • 👍 1
More from @yeahub_tech
  1. Oct 9, 2026#Собес #pipeline #ci #stage 🤔 Что происходит при автоматической сборке feature-ветки на s…
  2. Oct 8, 2026#course #задачи #тесты 📚 JavaScript. A3 Задачи Задачи на программирования на языке JavaSc…
  3. Oct 7, 2026#course #начинающие 📚 Твой Golang Твой Golang — это идеальный старт для освоения языка. П…
  4. Oct 5, 2026🧑‍💻 Вопросы с собесов для Node.js Разработчика 1. Как использовать Service Workers для р…
  5. Oct 2, 2026#Собес #transaction #propagation #required 🤔 Что такое propagation у транзакций и какие т…
  6. Oct 1, 2026#book #book 📚 Библия C#. 6-е изд. Автор: Михаил Фленов Это настольная книга программиста,…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →