Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






ДИНАМИЧЕСКОЕ РАСПРЕДЕЛЕНИЕ ПАМЯТИ




 

Одним из способов хранение информации, является использование системы динамического выделения памяти языка “С”. При этом память выделяется из свободной области памяти по мере надобности и возвращается назад, т.е. освобождается, когда необходимость в ней исчезает. Т.к. память выделяется и освобождается, то можно использовать ту же самую память в другой момент времени и для других целей в другой части программы. Ядром динамического выделения памяти в “С” являются функции, объявленные в стандартной библиотеке в загаловном файле stdlib.h.

 

Функция malloc()

 

Функция malloc() осуществляется запрос на выделение свободной памяти и при наличии таковой, запрошенный объем свободной памяти выделяется на нужды программы. Когда надобность в памяти отпадает, ее нужно освободить при помощи функции free(), при этом освобожденная память возвращается назад системе и вновь доступна для использования в этой или других программах.

void * malloc(unsigned size)

Функция malloc выделяет область памяти размером size байтов. В случае успеха, malloc возвращает указатель на начало выделенного блока памяти. Если для выделенной памяти не хватает места, возвращает NULL.

void free(free *ptr)

Функция освобождает область памяти, ранее выделенной при помощи функции malloc на которую указывает ptr. Если ptr- NULL, то free ничего не выполняет. Если ptr не является указателем, проинициализированным ранее одной из функций выделения памяти, то поведение функции не определено. Функция free не располагает средствами передачи ошибки, возможно возникающей при ее выполнении, равно как возвращаемым значением.

1. объявляется указатель на какой-то тип данных.

тип_данных *имя_указателя;

2. вызов функции malloc() для выделения области памяти

имя_указателя=(тип_данных *) malloc (количество*sizeof(тип_данных));

3. проверка, выделилась ли память

if(!имя_указателя)

{

printf (“Нет места!!!!\n”);

exit (1);// прекращение работы программы, причем в качестве аргумента, может быть //использовано любое целое число. Одна по соглашению было принято передавать 1, если причиной //прерывания программы послужила ошибка и 0 в остальных случаях.

}

4. использование выделенной памяти.

5. освобождение памяти

free( имя_указателя );

Пример:

1. Программа, которая динамически выделяет массив целых чисел.

#include<stdio.h>

#include<stdlib.h>

#include <malloc.h>

void main(){

int *ptr,n,i;

printf("Введите размер массива: ");

scanf("%d",&n);

ptr=(int *)malloc(n*sizeof(int));

if(!ptr)

{

printf("Нет места!!!\n");

Exit(1);

}

for(i=0;i<n;i++)

{

printf("[%d]=",i);

scanf("%d",&ptr[i]);

}

Free(ptr);

}

2. Программа, которая вводит строку, считает количество введенных символов, выделяет место и переписывает введенную строку в обратном порядке.

#include<stdio.h>

#include<stdlib.h>

#include <malloc.h>

#include<string.h>

void main(){

char x[100];

char *ptr;

Int n,i,j;

printf("Введите строку: ");

Gets(x);

n=strlen(x);

ptr=(char *)malloc((n+1)*sizeof(char));//для символьной строки, необходимо выделять на1 символ

//больше, для символа конец строки

if(!ptr)

{

printf("Нет места!!!\n");

Exit(1);

}

for(j=0,i=n-1;i>=0;i--,j++)

{

ptr[j]=x[i];

}

ptr[j]='\0';

Puts(ptr);

Free(ptr);

}

Задачи:

1. Написать программу, которая выделяет места, для двух целочисленных массивов. Ввод данных и сортировка, массивов в порядке возрастания, с использованием функций. За один просмотр получить общий рассортированный массив.

#include<stdio.h>

#include<stdlib.h>

#include <malloc.h>

void vvod_mas(int*,int);

void sort_vozr(int*,int);

Void main()

{

int *ptr1,*ptr2,*ptr3,n1,n2,i1=0,i2=0,i3=0;

printf("Введите размер I-го массива: ");

scanf("%d",&n1);

ptr1=(int *)malloc(n1*sizeof(int));

if(!ptr1)

{

printf("Нет места!!!\n");

Exit(1);

}

printf("Введите размер II-го массива: ");

scanf("%d",&n2);

ptr2=(int *)malloc(n2*sizeof(int));

if(!ptr2)

{

printf("Нет места!!!\n");

Exit(1);

}

ptr3=(int *)malloc((n2+n1)*sizeof(int));

if(!ptr3)

{

printf("Нет места!!!\n");

Exit(1);

}

printf("Введите I-ий массив:\n");

Vvod_mas(ptr1,n1);

printf("Введите II-ой массив:\n");

Vvod_mas(ptr2,n2);






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных