PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » Исследование опасности функций работы с памятью


Исследование опасности функций работы с памятью

Сообщений 1 страница 2 из 2

1

Код:
OpenConsole()

txt$="1234567890123456789" //19 байтов
*mem=AllocateMemory(10) //10 байтов
PrintN("MemorySize="+Str(MemorySize(*mem)))
If *mem
	PokeS(*mem,txt$) //пишем 19 байтов в блок размером 10 байтов
	PrintN(PeekS(*mem)) //читаем строку до zero-byte
	PrintN("MemorySize="+Str(MemorySize(*mem)))
EndIf

PrintN("Press Escape to exit")
Repeat
	KeyPressed$ = Inkey()
	Delay(20)
Until KeyPressed$ = Chr(27)

правильно ли я понял что при сохранении строки 19 байт в блок памяти размером 10 байт
9 байт были записаны на нераспределённое место?
И затерли бы расположенные там данные?

0

2

Эта строка занимает не 19 байт, а 20 в ascii и 40 в unicode формате. Чтобы находить такие ситуации нужно в настройках компилятора на вкладке "Компиляция/Запуск" поставить галочку в "Включить Purifier". Тогда отладчик сообщит о записи за пределами выделенной памяти.

[ОШИБКА] Строка: 7
[ОШИБКА] Overflow in a dynamically allocated memory block.

Правильнее этот код написать так

Код:
OpenConsole()

txt$="1234567890123456789" ;//19 байтов
*mem=AllocateMemory(StringByteLength(txt$)+SizeOf(Character)) ;//10 байтов
PrintN("MemorySize="+Str(MemorySize(*mem)))
If *mem
	PokeS(*mem,txt$) ;//пишем 19 байтов в блок размером 10 байтов
	PrintN(PeekS(*mem)) ;//читаем строку до zero-byte
	PrintN("MemorySize="+Str(MemorySize(*mem)))
EndIf

PrintN("Press Escape to exit")
Repeat
	KeyPressed$ = Inkey()
	Delay(20)
Until KeyPressed$ = Chr(27)

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Исследование опасности функций работы с памятью