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

Динамическими называются массивы, размер которых неизвестен на этапе написания

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

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

клавиатуры размер массива, все его элементы, а затем сортирует их и выводит на экран.

#include <stdio.h>

Main()

{

int N; // размер массива (заранее неизвестен)

int *A; // указатель для выделения памяти

printf ("Размер массива > "); // ввод размера массива

scanf ("%d", &N);

A = new int [N]; // выделениепамяти

if ( A == NULL ) { // если не удалось выделить

printf("Не удалось выделить память");

return 1; // выход по ошибке, код ошибки 1

}

for (i = 0; i < N; i ++ ) { // дальше так же, как для массива

printf ("\nA[%d] > ", i+1);

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

}

// здесь сортировка и вывод на экран

delete A; // освободить память

}

Итак, мы хотим выделить в памяти место под новый массив целых чисел во время работы

программы. Мы уже знаем его размер, пусть он хранится в переменной N(это число обязательно должно быть больше нуля). Оператор выделения памяти newвернет нам адрес нового выделенного блока и для работы с массивов нам надо где-то его запомнить. Вы уже знаете, что есть специальный класс переменных для записи в них адресов памяти – указатели.

• динамические массивы используются тогда, когда на момент написания программы раз-

мер массива неизвестен

• для того, чтобы работать с динамическим массивом, надо объявить указатель соответствующего типа (в нем будет храниться адрес первого элемента массива);

int *A;

• когда требуемый размер массива стал известен, надо использовать оператор newязыка

Си++, указав в скобках размер массива (в программе для краткости нет проверки на положительностьN) ;

A = newint[N];

нельзяиспользовать оператор newпри отрицательном или нулевом N;

• после выделения памяти надо проверить, успешно ли оно прошло; если память выделить не удалось, то значение указателя будет равно NULL, использование такого массива приведет к сбой программы;

• работа с динамическим массивом, на который указывает указательА, идет также, как и с обычным массивом размера N(помните, что язык Си не следит за выходом за границы

массива);

• после использования массива надо освободить выделенную память, вызвав оператор








Дата добавления: 2015-10-05; просмотров: 615;


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

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

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

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