Рефетека.ру / Информатика и програм-ие

Реферат: Динамическое распределение памяти

Динамическое распределение памяти

Курсовая работа по дисциплине основы алгоритмизации и программирования студента Золин А.С.

Министерство высшего и профессионального образования РФ

Уральский государственный технический университет

Радиотехнический факультет

Кафедра “Автоматика и информационные технологии”

Екатеринбург 2000

Введение

Целью работы является демонстрация работы с динамической памятью на примере программ разработанных к заданиям 2, 6, 8, 10, 12, 14, 16 из методического указания [1].

Динамическое распределение памяти предоставляет программисту большие возможности при обращении к ресурсам памяти в процессе выполнения программы, и корректная работа программы с динамической памятью в существенной степени зависит от знания функций для работы с ней.

Руководство пользователя

Задание №2

Для того чтобы убедиться что для каждого из однобайтовых данных в куче выделено 16 байт т.е. 1 параграф нужно сравнить три адреса, которые появяться на экран в рез-те действия этой программы. Если числа в этих адресах стоящие до двоеточия увеличиваютя (от первого к последнему) на еденичку, то это означает что на каждый блок выделен один параграф в куче = 16 байт. Для получения этих адресов в отладчике достаточно нажать Alt+F4 (в режиме отладчика) затем в появившемся запросе ввести *x появится меню, вверху которого и будет нужный адрес, аналогично для *y, *z.

Задание №6

Программа выделяет память под 20 переменных типа int, заполняет их случайными числами из интервала [-3;7] и выводит их на экран.

Задание №8

Программа хранит матрицы в виде двух структур:

                    Struct Matr1{int m, n; int *ptr};

                    Struct Matr2{int m, n; int **ptr};

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

                    Int DinMatr1(Matr1 *matr);

                    Int DinMatr2(Matr2 *matr);

Задание №10

Программа получает с клавиатуры натуральные числа, сохраняя их в куче, конец ввода – число 0. По окончании ввода числа выводятся на экран.

Задание №12

Программа вычисляет октоэдрическую норму матрицы произвольных размеров.

Задание №14

Программа вычисляет общий размер свободной кучи.

Задание №16

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

Руководство программиста

В этом разделе будут приведены листинги программ с комментариями.

Задание №2

#include                        

#include                        

#include                       

int main(void)                     

{                          

 char *x,*y,*z;               //Объявление переменных

 x=(char *)malloc(sizeof(char));                   //Выделение динамической памяти для *x     

 y=(char *)malloc(sizeof(char));                   // --//-- *y                        

 z=(char *)malloc(sizeof(char));                   // --//-- *z                         

 clrscr();                                                                   // Очистка экрана

 printf("Adress of *x=%pn",x);                    // Вывод на экран адреса начала блока для *x        

 printf("Adress of *y=%pn",y);                    // --//-- *y                          

 printf("Adress of *z=%pn",z);                    // --//-- *z                          

 free (z);                                                                   // Освобождение блока выделенного для *z

 free (y);                                       // --//-- *y                          

 free (x);                                       // --//-- *x

 /*

 Для того чтобы убедиться что для каждого из однобайтовых данных в куче

 выделено 16 байт т.е. 1 параграф нужно сравнить три адреса, которые поя-

 вяться на экран в рез-те действия этой программы. Если числа в этих адресах

 стоящие до двоеточия увеличиваютя (от первого к последнему) на еденичку, то

 это означает что на каждый блок выделен один параграф в куче = 16 байт.

 Для получения этих адресов в отладчике достаточно нажать Alt+F4 (в режиме

 отладчика) затем в появившемся запросе ввести *x появится меню, вверху

 которого и будет нужный адрес, аналогично для *y, *z.

 */

 return 0;

}

Задание №6

#include               

#include              

#include               

#include                   

#include              

//N_var - число элементов массива              

#define N_var 20             

main()                  

{                 

clrscr();                  

//Инициализация генератора случ. чисел

randomize();             

int *mas;                  

//Выделение памяти под массив                  

if (!(mas=(int *)malloc(sizeof(int          )*N_var)))

{                 

printf ("Не достаточно памяти для выделения массиваn");

exit (1);                  

}                 

//Заполнение массива случ. числами в диапазоне от -3 до 7 с одновременным

//выводом на экран                  

for (int i=0;iptr)=(int *)malloc(sizeof(int)*(matr->m)*(matr->n)))) return 0;                  

 return 1;                  

}                 

int DinMatr2 (Matr2 *matr)                  

{                 

 if (!(matr->ptr=(int **)malloc(sizeof(int *)*(matr->m)))) return 0;                  

 for (int i=0;im;i++)                

 {                

 if (!(matr->ptr[i]=(int *)malloc(sizeof(int)*(matr->n)))) return 0;                  

 }

 return 1;

}

void FreeMatr1(Matr1 *matr)

{

 if (matr->ptr) free (matr->ptr);

}

void FreeMatr2(Matr2 *matr)

{

 for (int i=0;im;i++)

 {

 if (matr->ptr[i]) free(matr->ptr[i]);

 }

 if (matr->ptr) free(matr->ptr);

}

Задание №10

#include                                  

#include                                 

#include                                  

#include                                      

main()                                     

{                                    

 clrscr();                                     

 char **mas;                                    

 int c,m=0,n=0;                             

 mas=(char **)malloc(sizeof(char *));          //Выделение памяти под первое число                                     

 mas[0]=(char *)malloc(sizeof(char));          //Выделение памяти под первую позицию                                                                                          //цифры в числе

 printf ("Intputn");                              

 while ((c=getch())-'0')                                  //Пока не ввели 0                   

 {                                   

 if (c==13)                          //При нажатии Enter выделение памяти                                   

 {                                    //под новое число                            

 mas[m][n]=0;                            

 m++;                            

 if (!(mas=(char **)realloc(mas,sizeof(char *)*(m+1))))                   

 {                         

 printf ("Не хватает памятиn");                   

 exit(1);                            

 }                         

 n=0;                    

 putch(10);                                                   //Перевод карретки и перевод строки

 putch(13);                       //при выводе на экран                            

 }                         

 if ((c'9')) continue;                //Проверка на ввод только цифр                            

 if ((!n)&&(m))                                                //Выделение памяти под первую позицию   

 {                                    //в следующем числе                           

 if(!(mas[m]=(char *)malloc(sizeof(char)) ))                         

 {

 printf ("Не хватает памятиn");

 exit(1);

 }

 }

 mas[m][n]=c;                              //Занесение цифры на нужную позицию

 n++;                              //в число

 if (n)                              //Выделение памяти под следующую

 {                                    //позицию в числе

 if (!(mas[m]=(char *)realloc(mas[m],sizeof(char)*(n+1))))

 {

 printf ("Не хватает памятиn");

 exit(1);

 }

 }

 putch (c);                        //Вывод цифры на экран

 }

 printf ("Outputn");

 for (int i=0;im)))) return 0;

 for (int i=0;im;i++)

 {

 if (!(matr->ptr[i]=(double *)malloc(sizeof(double)*(matr->n)))) return 0;

 }

 return 1;

}

void FreeMatr(Matr *matr)

{

 for (int i=0;im;i++)

 {

 if (matr->ptr[i]) free(matr->ptr[i]);

 }

 if (matr->ptr) free(matr->ptr);

}

void Setelem(Matr *matr,double M[3][3])

{

 for (int i=0;im;i++)

 {

 for (int j=0;jn;j++) (matr->ptr[i][j])=M[i][j];

 }

}

double OctNorm(Matr *matr)

{

 double max=0;

 double a=0;

 for (int i=0;im;i++)

 {

 max+=matr->ptr[i][0];

 }

 for (int j=0;jn;j++)

 {

 for (i=0;im;i++)

 {

 a+=matr->ptr[i][j];

 }

 if (a>max) max=a;

 a=0;

 }

 return max;

}

Задание №14

#include                                  

#include                                  

#include                                 

#include                                      

void main(void)                               

{                                    

 long N=1;                             

 char *A;                                     

 A=(char *)calloc(N,1024);          //Выделение в куче места                            

 do                                 

 {                                   

 free(A);                                        //Освобождение массива    

 A=(char *)calloc(N,1024);          //Выделение памяти под больший массив                         

 N++;                                                //Увеличение счетчика

 }                

 while(A!=NULL);               //Продолжать пока память выделяется

 printf("nMaximum size of heap N=%iKb",N);//Вывод результатов                  

}                 

Задание №16

#include

#include

#include

#include

#include

struct MATR

{

 int n,m;

 double **ptr;

 int read_(char name[80])

 {

          FILE *pf;

          int i=0,j=0;

          char c;

          char num[10];

          int pos=0,flag=1;

          m=0;

          n=0;

          if (!(pf=fopen(name,"rt"))) return 0;

          ptr=(double **)malloc(sizeof(double *));

          ptr[0]=(double *)malloc(sizeof(double));

          while ((c=fgetc(pf))!=EOF)

          {

           if (((c>='0')&&(cn) n=i;

           if (j>m) m=j;

          }

          n--;

          fclose (pf);

          return 1;

 }

 void free_()

 {

 for(int i=0;i

Рефетека ру refoteka@gmail.com