Инициализация памяти с помощью realloc () - PullRequest
0 голосов
/ 26 января 2019

Вопрос о realloc().

Если я хочу увеличить объем памяти, выделенной ранее, с помощью realloc().

Будет ли дополнительная память инициализироваться в 0 так же, как calloc() или нет?

Второй вопрос:

    int * p =(int*)malloc(10*sizeof(int));
    int* s = (int*)realloc(p,20);
    p=s;

Назначение s для p хороший способ изменить размер указателя p?

И можем ли мы realloc() память, выделенную с calloc()?

1 Ответ

0 голосов
/ 26 января 2019

Будет ли дополнительная память инициализирована на 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() успешно , значение указателя, переданного необязательно адрес любой действительной памяти больше. не читайте его и не читайте само значение указателя, поскольку выполнение этого в обоих случаях может вызвать неопределенное поведение.

...