Собственно очень интересует вопрос, если например массив нужно "обнулить", "очистить", не знаю как правильно выразится, чтобы туда не попал "мусор", нужно это делать мемсетом или можно заполнить массив нулями просто и это будет одно и тоже "{ 0 }", хотелось бы выслушать мнение людей с большим "опытом работы" в программировании, есть ли разница и может ли это повлечь какие-то проблемы в больших проектах(программах) или может это нужно делать как-то по другому?
OPENFILENAME ofn = { 0 };
ZeroMemory(&ofn, sizeof(ofn));
или
char FileName[260];
ZeroMemory(&FileName, sizeof(FileName));
Ответ
Для начала, локальные переменные необходимо инициализировать до первого чтения. Чтение неинициализтрованной переменной — очень серьёзная ошибка программиста, и может привести, например, к вылету программы. (Почитайте про undefined behaviour.)
Затем, код наподобие
OPENFILENAME ofn = { 0 };
уже есть инициализация, дополнительное «обнуление памяти» не нужно. (В современных версиях C++ обычно достаточно просто OPENFILENAME ofn = {};.)
В случае, когда вы объявляете массив, проще опять-таки попросить об инициализации компилятор (char FileName[260] = {};), чем обнулять массив вручную (ZeroMemory).
Другое дело, если вы хотите инициализировать массив ненулевым значением, это придётся делать вручную. Для «единичных» структур обычно можно всё ещё применять инициализацию:
MENUITEMINFO mii = { sizeof(MENUITEMINFO) };
Если вы собираетесь сразу же записывать данные в вашу структуру/массив, инициализация не имеет особого смысла. (Хотя хороший оптимизатор может увидеть это и выкинуть её.) Если вы собираетесь заполнять массив значениями, не имеет смысла перед этим прописывать всё нулями. Однако, если вы передаёте структуру/массив в чужую функцию, имеет смысл заранее посмотреть в документацию, читает функция эту структуру данных, или лишь заполняет её. Если вы твёрдо уверены, что функция лишь заполняет вашу структуру, можно пропустить инициализацию.
Комментариев нет:
Отправить комментарий