Доброго времени суток! Пытаюсь научится выделять динамически память с помощью 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. Объясните, как это работает? Есть ли другие, не касающиеся темы, косяки в данном коде? Спасибо.
HeapAlloc выделяет и возвращает указатель на блок памяти размером в 1 TCHAR. Но физическая память (или даже виртуальная) на этом не заканчивается. Ваш lstrcpy использует ее, но "без спроса". Скорее всего, там ничего важного не оказалось и поэтому программа "работает". Если выделить еще один блок памяти сразу после первого, то возможно, что lstrcpy его перезапишет и тогда код, использующий этот второй блок скорее всего будет работать неправильно, разве что только если вы не полагались на эту перезапись. Хотя, что такое "неправильно" - это очень большой вопрос! :)
Возможно, еще дело в том, что HeapAlloc выделяет блок достаточного размера, а скорее всего, большего.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей