Выделение памяти функцией malloc — КиберПедия 

Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...

История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...

Выделение памяти функцией malloc

2020-04-01 144
Выделение памяти функцией malloc 0.00 из 5.00 0 оценок
Заказать работу

 

При динамическом распределении памяти объекты размещаются в «куче» при конструировании объекта указывается размер запрашиваемой под объект памяти, и, в случае успеха, выделенная область памяти, условно говоря, «изымается» из «кучи», становясь недоступной при последующих операциях выделения памяти.

Постановка задачи:

Выделить память для входной строки используя функцию malloc. Получить выходную строку необходимой длины начиная с указанной позиции входной строки.

Листинг кода на языке С++ с применением ассемблерной вставки.

 

#include <stdio.h>

#include <iostream>

#include <stdlib.h>

main ()

{(LC_ALL, «rus»);len;pos;hello[] = «Введите строку!\n»;

char position[] = «Введите позицию:\n»;lengt[] = «Введите длину для подстроки:\n»;

const char fstring[] = «%s»;char fint[] = «%d»;

const int N = 256;string[N]; // Строка, с которой мы будем работатьstring1 [N];

__asm {

 

// Предложение ввести строкуeax, hello // загружаем адрес строки в eaxeax // кладем в стек адрес строкиdword ptr printf // выводим строку по данному адресуesp, 4 // чистим стек

 

// Выделение памяти под входную строкуeax, N // загружаем в eax размер строкиeax // кладем в стекdword ptr malloc // выделяем память под строкуesp, 4 // чистим стек

 

// Ввод строкиeax, string // загружаем адрес строки в eaxeax // кладем в стек адрес строкиdword ptr gets // считываем введенную строкуesp, 4 // чистим стек

 

// Ввод длины нужной подстроки и позиции, с которой она начинается

// выводим сообщение «введите позицию»eax, position // загружаем адрес строки в eaxeax // кладем в стек адрес строкиdword ptr printf // выводим строку по данному адресуesp, 4 // чистим стек

 

// ввод позицииeax, pos // загружаем адрес переменной в eaxeax // кладем в стекeax, fint // загружаем адрес в eaxeax // кладем в стекdword ptr scanf // считываем введенный символ как числоesp, 8 // чистим стек

 

// выводим сообщение «Введите длину для подстроки»eax, lengt // загружаем адрес строки в eaxeax // кладем в стек адрес строкиdword ptr printf // выводим строку по данному адресуesp, 4 // чистим стек

 

// ввод длины подстрокиeax, len // загружаем адрес переменной в eaxeax // кладем в стекeax, fint // загружаем адрес в eaxeax // кладем в стекdword ptr scanf // считываем введенный символ как числоesp, 8 // чистим стек

 

// Выделение памяти под подстрокуebx, N // загружаем в eax размер строкиebx // кладем в стекdword ptr malloc // выделяем память под строкуesp, 4 // чистим стек

eax, string // загружаем адрес входной строки в eaxebx, string1 // загружаем адрес выходной строки в ebxesi, pos // загружаем переменную в esiecx, len // загружаем переменную в ecx


 

CYCLE: // Начиная с заданной позиции переписываем len элементов string в string1

mov dh, [eax] [esi] // загружаем в dh адрес позиции нужного символа

mov [ebx], dhesi // увеличиваем значение регистраebx // увеличиваем значение регистра

loop CYCLE

mov [ebx], 0 // конец строки

lea eax, string1 // загружаем в eax адрес выходной строки

push eax // кладем в стек

lea eax, fstring

push eaxdword ptr printf // выводим строкуesp, 8 // чистим стек

}

system («pause»); // ожидание нажатия клавиши

};

 

Полученный exe-файл запустим в отладчике OllyDbg.

 

Рис. 5 Интерфейс ПО.

 


 

Заполняем входную строку, для которой мы выделили память, некоторыми символами. Перезаписываем 100 символов входной строки в выходную начиная с пятой позиции (Рис. 5). Открыв дамп памяти, мы можем убедиться в том, что память под строку выделилась, и все символы выходной строки записались (Рис. 6).

 

Рис. 6 dump-памяти


Заключение

 

Наиболее эффективным способом управления памятью является виртуальная память, вытеснившая в современных ОС методы распределения памяти фиксированными или перемещаемыми разделами.

Виртуальная память использует дисковую память для временного хранения не помещающихся в оперативную память данных и кодов выполняемых процессов ОС. У такого способа управления памятью тоже имеется свой недостаток. За счет частого обращения к дисковой памяти замедляется скорость выполнения процессов. Организация виртуальной памяти может быть статической или виртуальной. При статической организации ОС оперирует блоками адресов в адресном пространстве, а при виртуальной организации кучами. В практической части рассмотрена одна из функции библиотеки времени исполнения компилятора (malloc()) использующий, для выделения памяти, возможности куч.


Список литературы

память virtualalloc windows зарезервированный

1. Сетевые операционные системы / В.Г. Олифер, Н.А. Олифер-СПб.: Питер, 2002.

. Операционные системы / А.В. Гордеев

. Ассемблер. Учимся программировать/ Калашников О.А.-СПб.: БХВ-Питербург, 2006.

. Assembler. Учебник для вузов. 2-е изд. / В.И. Юров - СПб.: Питер, 2003.

. Системное программирование в среде Windows, 3-е издание / Харт, Джонсон, М.: Издательский дом «Вильямс», 2005.


Поделиться с друзьями:

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...

Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.016 с.