Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Динамическое размещенея данных




В языке Си есть операция, с помощью которой можно определить размер участка памяти в байтах, который компилятор отводит под массив после его объявления, это операция sizeof.Формат записи:

                              sizeof(параметр);                

параметр – тип объекта или его идентификатор (только не имя функции). Операция sizeof позволяет определить размер объекта по имени или типу, результатом является размер памяти в байтах (тип результата int).

Если указан идентификатор сложного объекта (массив, структура, объединение), то получаем размер всего сложного объекта. Например:

                   sizeof(int)              ->   2 байта,

       int b[5]; sizeof(b)  ->   10 байт;

       int c[3][4]; sizeof(c) ->   24 байта.

Операция sizeof применяется при динамическом распределении памяти:

float *x;                                        // Указатель массива

int n;                                           // Количество элементов массива

              x=(float*)calloc(n,sizeof(float)); // Захват и очистка памяти

Прототипы функций работы с памятью находятся в библиотеке alloc.h, рассмотрим основные из них:

void *calloc(unsigned n, unsigned m);    - возвращает указатель на начало области памяти для размещения n элементов по m байт каждый, при неудачном завершении возвращает значение NULL;

void *malloc(unsigned n);                        - возвращает указатель на блок памяти длиной n байт, при неудачном завершении возвращает значение NULL;

void *realloc(void *bf, unsigned n); - изменяет размер ранее выделенной памяти с адресом начала bf на n байт;

void free(void *bf);                                  - освобождает ранее выделенный блок памяти с адресом bf;

coreleft(void);                   - возвращает значение объема неиспользованной памяти (тип возвращаемого результата unsigned – для моделей памяти tiny, small, medium; unsigned long – для других моделей памяти).

 

Приведем пример динамического размещения одномерного массива

       #include<stdio.h>

       #include<stdlib.h>

       #include<conio.h>

       #include<alloc.h>

       void main(void)

       { int i,n; float *a;

       puts(“\n Input n:”); scanf(“%d”,&n);

            printf(“\n Свободная память -%d”,coreleft());

a=(float *)calloc(n,sizeof(float));             // захват памяти

           printf(“\n Array a \n”);

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

                                          *(a+i)=(float)random(10); // диапазон от 0 до 10

                              printf(“ %d“, a[i]);

                                                      }

            printf(“\n Память после захвата -%d”,coreleft());

free(a);                                                      // освобождение памяти

       getch(); }

 










Последнее изменение этой страницы: 2018-05-10; просмотров: 165.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...