Динамические массивы

7.1 Одномерные динамические массивы

Объем памяти, выделяемый для обычного массива, определяется на этапе компиляции в соответствии с обязательным указанием размера массива.

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

Для формирования массивов динамической памяти использу­ются указатели и специальные функции и операторы. В языке Си в заголовочных файлах <stdlib.h> и <alloc.h> описаны функции malloc(), free(), которые предназначены для выделения, изменения и освобождения участков динамической памяти. Они сообщают (возвращают) в программу адрес начала свободного участка памяти (при его наличии) достаточного размера, т.е. они возвращают указатель. Этот указатель обычно (в зависимости от компилятора) имеет тип void*, который нужно преобразовать к типу данных создаваемого массива. После использования память освобождается.

Синтаксис следующий:

int n; scanf("%d",&n); //число элементов в массиве

тип *имя;

имя=(тип*)malloc(n*sizeof(тип));

if(имя==NULL){puts("Ошибка выделения памяти!");return-1;}

//программа

Free(имя);

Пример. Создать динамический массив для чисел типа int, размер задать с клавиатуры.

#include <stdio.h>

#include <alloc.h>

Int main()

{int n, *ptr;

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

scanf("%d",&n);

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

if(ptr==NULL){puts("Ошибка выделения памяти!");

return -1;}

puts("Введите элементы массива");

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

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

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

printf("%d\n",*(ptr+i));

free(ptr); return 0;}

В этом примере функция malloc() осуществляет запрос у операционной системы n*sizeof(int) байт свободной памяти для размещения массива чисел типа int. При наличии свободной памяти возвращается указатель типа void* на начало выделенного блока памяти, иначе ‑ NULL. Дальше выполняется преобразование типа void* в тип int*. Далее в выделенную память помещаются значения элементов массива, причем, доступ к элементам массива можно осуществлять как с помощью индексов, так и методом разыменования указателей на элементы. В конце выполняется вызов функции free(), которая освобождает выделенную ранее память.

В языке С++ введены специальные операции new, deleteи delete[].Операцию delete[] следует применять, если память выделена под массив, а операцию delete для освобождения памяти, предоставленной для простых переменных.

Синтаксис для одномерного массива такой

int n; scanf("%d",&n); //число элементов в массиве

тип *имя;

имя=new тип[n];//запрос памяти под элементы массива

if(имя==NULL){puts("Ошибка выделения памяти!");return -1;}

//программа

delete[]имя; //освобождение памяти

Пример. Создается динамический массив для чисел типа long, в который записываются случайные числа от 1 до 100, и находится произведение всех чисел. В конце программы память освобождается.

#include <stdio.h>

#include <stdlib.h>

Int main()

{int n,i,j;

long *arr,mul=1L;

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

scanf("%d",&n);

arr=new long[n];//запрос памяти под элементы массива

if(arr==NULL) {puts("Ошибка выделения памяти!");

return -1;}

randomize(); //запуск генератора случайных чисел

for(i=0;i<n;i++) {*(arr+i)=random(100)+1;

mul*=arr[i];}

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

printf("arr[%d]=%ld\n",i,arr[i]);

printf("mul=%ld\n”, mul);

delete [] arr; //освобождение памяти

Return 0;

}


7.2 Двумерные динамические массивы

Для создания двумерного динамического массива используется указатель на массив указателей.

Синтаксис для создания двумерного массива динамической памяти с помощью функций mallocследующий:

//ввод количества элементов строк n и элементов в строке m

int n,m; scanf("%d%d",&n,&m);

тип **имя; //определение указателя на массив указателей

//запрос памяти для n указателей на строки

имя=(тип**)malloc(n*sizeof(тип*));

if(имя==NULL){puts("Ошибка выделения памяти!");return -1;}

//запрос памяти для m элементов в nстроках

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

{имя[i]=(тип*)malloc(m*sizeof(тип));

if(имя[i]==NULL){puts("Ошибка выделения памяти!");

free(имя); return -1;}

}

//программа

for(i=0;i<m;i++) free(имя[i]);

Free(имя);

Синтаксис для двумерного массива с использованием операции new и delete такой:

//ввод количества элементов строк n и элементов в строке m

int n, m; scanf("%d%d",&n,&m);

тип **имя; //определение указателя на массив указателей

имя=new тип*[n];//запрос памяти для указателей на строки

if(имя==NULL){puts("Ошибка выделения памяти!");return -1;}

//запрос памяти для элементов в строках

for(int i=0;i<m;i++)

{имя[i]=new тип[n];

if(имя[i]==NULL){puts("Ошибка выделения памяти!");

delete[]имя; return -1;}

}

//программа

for(i=0;i<m;i++) delete имя[i];

delete[]имя; //освобождение памяти

Пример. Создать двумерную матрицу, ввести с клавиатуры количество строк и столбцов, а также ввести с клавиатуры значения элементов и заменить отрицательные элементы нулями.

#include <stdio.h>

Void main()

{int N, M, i, j;

int **ma; //указатель на массив указателей на строки

puts("Введите число строк и столбцов матрицы");

scanf("%d%d",&N,&M);

ma=(int**)malloc(N*sizeof(int*));

//запрос памяти под указатели на строки

//ma=new int*[N}; //для операцииnew – delete

if(ma==NULL){printf("Ошибка выделения памяти!\n");return-1;}

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

{ma[i]=(int*)malloc(M*sizeof(int)); ));

//запрос памяти под элементы в строке

// ma[i]=new int[M]; //для операцииnew – delete

if(ma[i]==NULL)

{printf("Ошибка выделения памяти!\n");








Дата добавления: 2016-04-11; просмотров: 2014;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

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

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.014 сек.