Ваш код не выглядит мне чистым по другим причинам, но ...
void reallocFunction(Point * r){
r=(Point *) realloc(r,r[0].x*2*sizeof(Point));
r[0].x*=2;
r[0].y++;
}
Проблема здесь в том, что r
в этой функции является параметром, поэтому любые изменения в ней будут потеряныкогда функция возвращается.Вам нужен какой-то способ изменить версию вызывающего абонента на r
.Я предлагаю:
Point * // Note new return type...
reallocFunction(Point * r){
r=(Point *) realloc(r,r[0].x*2*sizeof(Point));
r[0].x*=2;
r[0].y++;
return r; // Note: now we return r back to the caller..
}
Затем позже:
r = reallocFunction(r);
Теперь ... Еще одна вещь, которую следует учитывать, это то, что realloc
может потерпеть неудачу.Общий шаблон для realloc
, который объясняет это:
Point *reallocFunction(Point * r){
void *new_buffer = realloc(r, r[0].x*2*sizeof(Point));
if (!new_buffer)
{
// realloc failed, pass the error up to the caller..
return NULL;
}
r = new_buffer;
r[0].x*=2;
r[0].y++;
return r;
}
Это гарантирует, что вы не пропустите r
при сбое выделения памяти, и тогда вызывающая сторона должна решить, что произойдет, когда вашфункция возвращает NULL
...
Но некоторые другие вещи, на которые я хотел бы обратить внимание в этом коде (я не хочу сказать, что я придираюсь к вещам и пытаюсь их разлучить;подразумевается как конструктивная обратная связь при проектировании):
- Имена переменных и членов не дают четкого представления о том, что вы делаете.
- У вас много магииконстанты.Нет никакого объяснения тому, что они имеют в виду или почему они существуют.
reallocFunction
, кажется, не имеет никакого смысла.Возможно, имя и интерфейс могут быть более понятными.Когда вам нужно realloc
?Почему вы удваиваете член X?Почему вы увеличиваете Y?Может ли звонящий принять эти решения вместо этого?Я хотел бы прояснить это. - Точно так же не ясно, что должен делать
enter()
.Возможно, имена могли бы быть более четкими. - Это хорошая вещь, чтобы распределять и управлять переменными-членами в согласованном месте, поэтому легко определить (и позже, возможно, изменить), как вы должны создать, уничтожить и манипулировать одним из этих объектов.Здесь, в частности, кажется, что
main()
хорошо знает внутренности вашей структуры.Это кажется плохим. - Использование оператора умножения в параметрах до
realloc
в способе, который вы делаете, иногда является красным флагом ... Это угловой случай, но умножение может переполниться, и вы можете в конечном итогесокращение буфера вместо его роста.Это может привести к сбою, и при написании производственного кода важно избегать этого по соображениям безопасности.