Вопрос

Я унаследовал следующую линию кода:

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 даст только размер указателя.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top