Где realloc()
найти расширения памяти:
- Если есть достаточно свободного места после первоначальной памяти, то он будет использовать, что и исходный адрес не изменится.
- Если память orignal находится в конце кучи/.., она расширяет память, поэтому исходный адрес не изменяется.
- Если исходная память находится в середине кучи/.., и недостаточно места, тогда она будет выделять новый блок памяти и скопировать исходную память в новые, чтобы изменить адрес.
Последний случай случается с большой вероятностью, поэтому вам всегда нужно обновить свой адрес после звонка realloc()
.
И старый адрес может быть помещен в список свободной памяти, вы не должны касаться его больше.Он может быть выделен другим вызовом malloc()/.. в будущем.
И вы можете видеть, что realloc()
может быть тяжелым, потому что ему, возможно, потребуется скопировать память, поэтому улучшите код, чтобы избежать его использования, если это возможно.
Вот возможный вариант использования (от TLPI):
// nptr is new pointer, ptr is your original pointer,
nptr = realloc(ptr, newsize);
if (nptr == NULL) {
/* Handle error */
} else {
/* realloc() succeeded */
ptr = nptr;
}
Основном, сначала проверьте возвращаемое значение, чтобы увидеть ли удастся:
- Если не удалось, то оригинальный память останется unchange.
- Если удастся, назначьте новый адрес исходному указателю.
И вам нужно убедиться, что у вас нет другого указателя, указывающего на середину исходной памяти, потому что это тоже изменится, использование смещения для начала адреса может облегчить задачу.
Если изменение размера массива часто, то вы могли бы выделить больше памяти, помните, его размер, и перераспределить его только тогда, когда размер достигается, когда изменение размера вы также дать большее значение, чем новое значение.
Вы можете выбрать коэффициент при изменении размера, например factor = 1.5
, средства: new_size = old_size * factor
.
Итак, вы имеете в виду, что мне нужно сделать что-то вроде этого: player [i] = realloc (player [i], sizeof (Player *)) ??? – motis10
@ user1703871 Я обновил свой ответ, вы можете выбрать любую логику, которая вам подходит. :-) –
@ user1703871 yes, если вы хотите изменить 'player [i]', что вы, безусловно, можете сделать из 'initializeListForTree()'. но тогда, почему вы используете 'realloc()'? что проблема с простой 'malloc()'? –