По стандарту аргументы функций 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 указывают на один и тот же объект, т.е. они являются псевдоименами. Неуправляемое использование псевдоимен может нанести ущерб пониманию текста программы, так как возможность доступа к одному и тому же объекту и его модификация с помощью различных псевдоимен не всегда очевидны при анализе части программы.