Вопросы динамического распределения памяти с помощью realloc и calloc - PullRequest
2 голосов
/ 18 ноября 2011

См. Следующую функцию:

int go(void) {
   int *p, *q;
   p = calloc(10,sizeof(int));
   q = realloc(p, 20 * sizeof(int));
   <<X>>
}

Предполагая, что оба вызова функции выделения памяти выполнены успешно, какое из следующих утверждений верно для маркера точки <<X>>.

  1. Значения p и q одинаковы.
  2. p указывает на 10 целых чисел, каждое со значением 0.
  3. q указывает не менее 80 байт памяти.

Этот вопрос в моей тестовой статье C. За исключением (2), что, очевидно, верно. Я довольно запутался по поводу (1) и (3). Кто-нибудь может мне это объяснить?

Ответы [ 6 ]

2 голосов
/ 18 ноября 2011

Оформить документацию .В частности (выделение добавлено):

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При успешном завершении с размером, не равным 0, realloc () возвращает указатель на (возможно, перемещено) выделенное пространство.Если размер равен 0, возвращается либо нулевой указатель, либо уникальный указатель, который может быть успешно передан free ().Если свободной памяти недостаточно, realloc () возвращает нулевой указатель и устанавливает errno на [ENOMEM].

Таким образом, p и q могут бытьто же самое (если realloc может изменить размер существующего блока памяти), но это не гарантировано (и поэтому на него не следует полагаться).

Согласно стандарту C , int должно быть не менее 16 бит (2 байтов), поэтому sizeof(int) равно не менее 40, поэтому (3) не обязательно верно.

1 голос
/ 18 ноября 2011

Как сказал Брендан, (1) не обязательно верно (и, вероятно, не верно).

В C, как правило, "int" составляет 4 байта, поэтому (3) должно быть верно.Это верно для всех систем, о которых я знаю, хотя я не уверен, что стандарт C говорит, что int должен иметь длину четыре байта.

0 голосов
/ 18 ноября 2011

Поскольку это вопрос экзамена, мы должны обратиться к спецификации. Все три считаются ложными.

  1. realloc может вернуть указатель, отличный от p.
  2. realloc может освободить память, на которую указывает p, если вновь выделенное пространство находится в другом месте. Это означает, что p все еще может указывать на десять нулей, но это не то, что сказано в спецификации.
  3. Как хорошо объяснено в других ответах, мы не знаем размер int (поэтому мы используем sizeof (int)).
0 голосов
/ 18 ноября 2011

Проверьте эти ссылки. Они говорят, что 1 может быть истинным или ложным, как и не может сказать http://www.thinkage.ca/english/gcos/expl/c/lib/reallo.html

Надеюсь, что эта информация поможет вам, как многие уже объяснили о третьем случае

1 имеет значение true или false

, поскольку q указывает на перераспределенную память.Это может быть то же самое, что и «p», если старый блок памяти можно увеличить (или сократить) до нового размера;в противном случае это будет другой блок.Пространство начинается на границе выравнивания, которая подходит для хранения объектов любого типа данных.Если память не может быть получена или если аргумент указан неправильно, возвращается указатель NULL.

0 голосов
/ 18 ноября 2011

1) оба p и q являются указателями. Посмотрите документацию о том, что realloc делает для ответа.
3) Это утверждение неоднозначно. В C значения указателей обычно являются скалярными адресами в байтовом местоположении. Размер выделенного блока памяти неизвестен. Тип указателя используется для определения размера шага при выполнении арифметики указателя, но если вы выделили буфер нескольких размеров некоторого типа, это все еще неизвестно из самой переменной.

0 голосов
/ 18 ноября 2011

Объем памяти, на который указывает q , зависит от размера типа int , который может быть не четыре байта.Утверждение 1 также не обязательно верно.На странице руководства realloc(3) в моей системе:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...