Главная

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

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

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

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

ТОР 5 статей:

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

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

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

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

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

КАТЕГОРИИ:






Принцип работы malloc и free. Как можно проверить смогли ли выделить память.




Основу системы динамического распределения в С составляют функции malloc() и free(). Эти функции работают совместно. Функция malloc() выделяет память, а free() — освобождает ее. Это значит, что при каждом запросе функция malloc() выделяет требуемый участок свободной памяти, a free() освобождает его, то есть возвращает системе. В программу, использующую эти функции, должен быть включен заголовочный файл <stdlib.h

void* malloc(size_t); //функция выделения памяти

voidfree(void* memblock); //функция освобождения памяти

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

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

Поскольку динамически распределяемая область памяти не бесконечна, при каждом размещении данных необходимо проверять, состоялось ли оно. Если malloc() не смогла по какой-либо причине выделить требуемый участок памяти, то она возвращает нуль. В следующем примере показано, как выполняется проверка успешности размещения:

p = malloc(100);

if(!p) {

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

Exit(1);

}

22. Способы передачи одномерного массива в функцию. Отличия передачи одномерного массива в функцию от передачи текстовой строки.

Массив - это набор однотипных данных, доступ к которым может быть осуществлен по индексу, т.е. по номеру элемента. Одномерный массив - массив, с одним параметром, характеризующим количество элементов одномерного массива(массив, у которого может быть только одна строка, и n-е количество столбцов). Столбцы в одномерном массиве - это элементы массива. Функция -это поименованная часть программы, которая может вызываться из других частей программы столько раз, сколько необходимо. Функция, в отличие от процедуры, обязательно возвращает значение.

Способы передачи одномерного массива в функцию. В языке С нельзя передать весь массив как аргумент функции. Однако можно передать указатель на массив, т.е. имя массива без индекса. Например, в представленной программе в func1() передается указатель на массив i:

int main(void)

{

int x[10];

func1(x);

/*... */

}

Если в функцию передается указатель на одномерный массив, то в самой функции его можно объявить одним из трех вариантов: как указатель, как массив определенного размера и как массив без определенного размера. Например, чтобы функция func1()получила доступ к значениям, хранящимся в массиве x, она может быть объявлена как

void func1(int *x) / /* указатель */

{

/*... */

}

или как

void func1(int x[10])/ /* массив определенного размера */

{

/*... */

}

и наконец как

void func1(int x[]) //* массив без определенного размера */

{

/*... */

}

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

Текстовая строка - это массив элементов типа char. Из за специального формата хранения строки, размер строки передавать необязательно. Признак окончания строки – “\0”

Отличия передачи одномерного массива в функцию от передачи текстовой строки.

Передача символьной строки в функцию подобна передаче любого массива в качестве параметра. Внутри функции вам нужно просто указать тип массива (char) и левую и правую скобки массива. Размер строки указывать не надо,так как символ NULL указывает конец строки, функция не требует параметр, который задает количество элементов в массиве. Вместо этого функция может определить последний элемент, просто найдя в массиве символ NULL. Символ NULL представляет собой символ ASCII 0.






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

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