Создание динамических объектов

По стандарту аргументы функций malloc, calloc имеют тип возвращаемого объекта void*.

char *s = (char*)malloc(size);unsigned size; /* объем памяти, который необходимо выделить */char *s = (char *)calloc(nelem,elsize);unsigned nelem; /* число элементов, для которых нужно выделить память */unsigned elsize; /* объем памяти, который необходимо выделить для каждого элемента *//* либо просто заменив char* на void* */void* calloc(nelem, elsize);unsigned nelem;unsigned elsize;

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

sizeof (выражение)

Объем памяти, необходимый для хранения выражения:

sizeof(T)

Объем памяти, необходимый для хранения значений типа T.

Функции malloc и calloc возвращают указатель на созданный динамический объект. Фактически функции возвращают знаковые указатели, которые могут быть явно преобразованы к подходящему типу указателя. Значения, возвращенные функциями распределения памяти, используются для ссылок на динамические объекты. Например, с помощью оператора

pi = (int *) malloc(sizeof(int));

выделяется память для одного целого значения. Адрес этой области памяти присваивается переменной pi после его преобразования из типа char * (указатель на знак), с которым он возвращается функцией malloc, к типу int * (указатель на целое), т.е. типу переменной pi.

Доступ к динамическим объектам

Присваивание значения объекту, ссылка на который задана указателем pi, выполняется с помощью имени указателя *pi, например:

*pi = 55;

Одно и то же значение может быть присвоено более чем одной переменной-указателю. Таким образом, можно ссылаться на динамический объект с помощью более одного указателя. Про объект, к которому можно обращаться с использованием более чем одного указателя, говорят, что он имеет псевдоимена (alias). Например, в результате присваивания

qi = pi;

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: