Почему этот код работает? HeapAlloc

215
17 июля 2017, 16:10

Доброго времени суток! Пытаюсь научится выделять динамически память с помощью winapi.

{
HANDLE hHeap = GetProcessHeap();
TCHAR *strName = (TCHAR*)HeapAlloc(hHeap, 0, 1 * sizeof(TCHAR));
lstrcpy(strName, _T("Hello"));
MessageBox(0, strName, 0, 0);
HeapFree(hHeap, 0, strName);
}

Проблема в том, что я не понимаю, почему этот код нормально работает.. Вроде как я выделяю память под 1 символ, а заношу туда 5 символов(это не включая завершающего нуля), более того, даже если я вместо 1 * sizeof(TCHAR) напишу 0, оно тоже работает и выдает полноценное Hello. Объясните, как это работает? Есть ли другие, не касающиеся темы, косяки в данном коде? Спасибо.

Answer 1

HeapAlloc выделяет и возвращает указатель на блок памяти размером в 1 TCHAR. Но физическая память (или даже виртуальная) на этом не заканчивается. Ваш lstrcpy использует ее, но "без спроса". Скорее всего, там ничего важного не оказалось и поэтому программа "работает". Если выделить еще один блок памяти сразу после первого, то возможно, что lstrcpy его перезапишет и тогда код, использующий этот второй блок скорее всего будет работать неправильно, разве что только если вы не полагались на эту перезапись. Хотя, что такое "неправильно" - это очень большой вопрос! :)

Возможно, еще дело в том, что HeapAlloc выделяет блок достаточного размера, а скорее всего, большего.

READ ALSO
SystemError: <built-in function func_math> returned a result with an error set

SystemError: <built-in function func_math> returned a result with an error set

Хочу связать си\с++ код с кодом pythonДля этого сделал решение в котором 2 проекта: 1 на плюсах, 1 на питоне

387
Можно ли отследить событие вызова Skype и/или любого SIP-клиента?

Можно ли отследить событие вызова Skype и/или любого SIP-клиента?

Есть ли способ отследить событие звонка Skype из своего приложения?

248
Специализация шаблона функции

Специализация шаблона функции

Здравствуйте люди добрые! Решаю задачку по плюсам, суть такая, что не могу написать специализацию шаблона функции - компилятор ругаетсяСуть...

296
Проблема с TerminateThread

Проблема с TerminateThread

Создаю поток

231