Почему мусор в моем TCHAR, даже после Zeromemory ()?
Вопрос
Я унаследовал следующую линию кода:
TCHAR temp[300];
GetModuleFileName(NULL, temp, 300);
Однако это терпит неудачу, так как первые 3 байта заполнены значением мусора (всегда теми же тем, кто, хотя, -128, -13, 23, в этом порядке). Я сказал, хорошо хорошо и изменил его на:
TCHAR temp[300];
ZeroMemory(temp, 300);
GetModuleFileName(NULL, temp, 300);
Но ценности мусора сохранялись! Обратите внимание, что после вызова Zeromemory () все остальные байты были обнулены должным образом и после GetModuleFilename (), каталог был правильно сохранен в буфере. Это как если бы Темп был заменен темп + 3. Может ли это иметь что делать с границами слова?
Может кто-нибудь объяснить, что происходит и как это исправить?
Решение
ZeroMemory
Работает с точки зрения байтов, тогда как у вас есть массив 300 TCHAR
с. Это заставляет меня предположить, что вы работаете с WideChar (не многобайтовым) вариантом компиляции.
Вы должны использовать:
ZeroMemory(temp, 300 * sizeof(TCHAR));
Или в вашем конкретном случае:
ZeroMemory(temp, sizeof(temp));
Однако будьте осторожны с последним. Это применимо, если temp
является автоматическим массивом, чья декларация видима в функции. Если это указатель, чей размер выделения «невидимый» для компилятора - sizeof
даст только размер указателя.