Несколько быстрых мыслей:
for (i = 1; i < num_places; i++)
{
num_places
, будучи индексом массива, начнется с 0
.Этот цикл плохо провалится, если в вашем списке только ноль или одно оружие.(Условие i < num_places
проверяется после первой итерации тела цикла. Если weap_List
имеет один элемент (с индексом 0
), этот цикл будет обращаться к памяти, котораяне распределяется и не печатать оружие. Запустить циклы обработки массивов с 0
. Единственный раз, когда вы должны когда-либо допускать одноиндексные массивы, это когда вы перемещаете огромное количество кода FORTRAN в C; при запускес нуля, используйте массивы с нулевым индексом, как и предполагал K & R.:)
void *_tmp = realloc(weap_List, (num_allocated * sizeof(weapon)));
weap_List = (weapon*)_tmp;
Если бы _tmp
было объявлено (weapon *) tmp = realloc(...)
, тогда вам не понадобился бы (weapon *)
бросьте на следующей строке.
Крошечный придира: удвоение размера - довольно дорогой способ добавления 196609-го оружия.Рассмотрим только рост на восемь каждый раз.(По вашим именам я предполагаю, что вы, вероятно, не собираетесь добавлять один элемент в секунду в течение нескольких недель подряд.)
Крошечный придира: избегайте _prefix
имен переменных, они зарезервированы для Cсреда выполнения.Да, почти каждая программа использует их, и да, Я использовал их, и да, это, вероятно, безопасно :), но они технически защищены.Достаточно простого tmp
.
Больший придир: вы не проверяете возвращаемое значение из realloc(3)
.Это может потерпеть неудачу.Ваше приложение должно обрабатывать сбои как можно более изящно.