Будет ли дополнительная память инициализирована на 0?
Нет.
можем ли мы realloc()
память, выделенную с помощью calloc()
?
Да.
Назначение s
для p
хороший способ изменить размер указателя p
Зависит от
Просто сделать
int * p = malloc(...);
int * s = realloc(p, ...);
p = s;
- это то же самое, что и
int * p = malloc(...);
p = realloc(p, ...);
int * s = p;
В обоих случаях, если realloc()
не удастся (и с этим будет возвращено NULL
) адрес исходной памяти потерян.
Но выполнение
int * p = malloc(...);
{
int * s = realloc(p, ...); /* Could use a void* here as well. */
if (NULL == s)
{
/* handle error */
}
else
{
p = s;
}
}
устойчиво к сбоям realloc()
.Даже в случае сбоя исходная память по-прежнему доступна через p
.
Обратите внимание, что если realloc()
успешно , значение указателя, переданного необязательно адрес любой действительной памяти больше. не читайте его и не читайте само значение указателя, поскольку выполнение этого в обоих случаях может вызвать неопределенное поведение.