Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
44
Добавлен:
16.02.2016
Размер:
1.2 Mб
Скачать

Void *malloc(size_t size);

Данная функция призвана выделить в памяти блок размером size байт из кучи.

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

При неудачном результате операции с памятью функция возвращает NULL - зарезервированный идентификатор со значением '\0' (абсолютное значение 0x00). При этом содержимое блока остается неизменным. Если в качестве аргумента функции указано значение 0, функция возвращает NULL.

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

int pint = (int*)malloc(3*sizeof(int));

В отличие от malloc, функция calloc кроме выделения области памяти под массив объектов еще производит инициализацию элементов массива нулевыми значениями. Функция имеет следующий синтаксис:

Void *calloc( size_t num, size_t size );

Аргумент num указывает, сколько элементов будет храниться в массиве, а параметр size сообщает размер каждого элемента в байтах. Приведенный здесь тип size_t (объявлен в заголовочном файле stddef .h) является синонимом типа unsigned char, возвращаемого оператором sizeof.

Функция освобождения памяти free в качестве единственного аргумента принимает указатель на удаляемый блок объектов (*block) и имеет синтаксис:

Void free(void *block);

Данная функция подключается в заголовочном файле stdlib.h или alloc.h. Тип объектов удаляемого блока может быть произвольным, на что указывает ключевое слово void.

Рассмотрим пример выделения динамической памяти для десяти объектов типа int, заполнение выделенной области числами от нуля до девяти и освобождение ресурса памяти.

#include <iostream.h>

#include <alloc.h>

Int main(void)

{

Int* pRegion;

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

if ((pRegion =

(int*)malloc(10*sizeof (int)))==NULL)

{

cout « "He достаточно памяти\n";

// Завершить программу, если не

// хватает памяти для выделения

return 1;

}

// Заполнение выделенного блока памяти

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

*(pRegion+i) = i;

// Вывод значений заполненного блока

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

{

cout « (*pRegion) « '\n';

pRegion++;

}

// Освобождение блока памяти

free(pRegion);

return 0 ;

}

Пример динамического выделения памяти под двумерный массив Array [10] [20] переменных типа int выглядит следующим образом:

Array = (int*)malloc(10*20*sizeof(int));

В стандарт С++ включена поддержка нескольких наборов символов. Традиционный 8-битовый набор символов называется "узкими" символами. Кроме того, включена поддержка 16-битовых символов, которые называются "широкими". Для каждого из этих наборов символов в библиотеке имеется своя совокупность функций.

Как и в ANSI С, для представления символьных строк в С++ не существует специального строкового типа. Вместо этого строки в С++ представляются как массивы элементов типа char, заканчивающиеся терминатором строки - символом с нулевым значением ('\0'). Строки. заканчивающиеся нуль-терминатором, часто называют ASCIIZ-строками. Символьные строки состоят из набора символьных констант, заключенного в двойные кавычки:

"Это строка символов..."

В таблице 4.1 приведен набор констант, применяющихся в C++ в качестве символов.

Таблица 4.1. Классификация символов

прописная буква

от 'А' до 'Z',от 'А' до 'Я'

строчная буква

от 'а1 до 'z',от 'а' до 'я'

Цифра

от ' 0' до ' 9 '

Пустое место

горизонтальная табуляция ' \9 ' . перевод строки (код ASCII 1 0), вертикальная табу ляция (код ASCII 11), перевод формы код ASCII 12), возврат каретки

(код ASCII 13)

символы

пунктуации

!"#$%&' ()*+,-./:;<=>?@[\]^_{|}~

управляющий символ

все символы с колами от 0 до 1Fh включительно и символ с кодом 7Fh

Пробел

символ пробела (код ASCII 32)

шестнадцатеричная цифра

от '0' до '9', от 'А' до 'F', от 'а' до 'f '

При объявлении строкового массива необходимо принимать во внимание наличие терминатора в конце строки, отводя тем самым под строку на один байт больше:

// Объявление строки размером 10 символов,

// включая терминатор. Реальный размер

// строки: 9 символов + 1 терминатор

char buffer[10];

Строковый массив может при объявлении инициализироваться начальным значением. При этом компилятор автоматически вычисляет размер будущей строки в добавляет в конец нуль-терминатор:

// Объявление и инициализация строки:

char Wednesday[] = "Среда";

// что равносильно:

char Wednesday[]=

{'С','р','е','д','а','\0'};

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

Рассмотрим пример объявления символьных строк и использования функции ввода getline ().

#include <iostream.h>

Соседние файлы в папке ЛекцииКарасева