Помимо предложения, которое я сделал в комментарии об использовании связанного списка / NSMutableArray
, мое другое предложение будет состоять в том, чтобы вы использовали realloc()
вместо постоянного использования malloc()
, копирование вручную, а затем free()
использование старого выделения.
void * realloc(void *ptr, size_t size);
Функция realloc()
пытается изменить размер выделения, на который указывает ptr
, на size
и возвращает ptr
.Если недостаточно места для увеличения выделения памяти, на которое указывает ptr
, realloc()
создает новое распределение, копирует столько старых данных, на которые указывает ptr
, сколько будет соответствовать новому выделению, освобождает староеВыделение и возвращает указатель на выделенную память.
Это в значительной степени именно то, что вы делаете, но вы можете позволить библиотеке справиться с этим за вас.
(Могу ли я также смиренно предложить немного меньше использовать слово «focal» для именования переменных в вашей функции?) (Кроме того, я не совсем понимаю, почему focalPoints
в вашей структуре является указателем -to-pointer. Вам просто нужен массив структур - с одним указателем все будет в порядке.)
Рассмотрим следующую (несколько обширную) переписать;надеюсь, что это поможет каким-то образом.
typedef struct{
CGPoint *points; // Single pointer
NSUInteger count;
CGRect boundingRect;
} FocalPoints;
// Renamed to match Apple's style, like e.g. CGRectIntersectsRect()
void FocalPointsAddPoint (FocalPoints *, CGPoint);
void FocalPointsAddPoint (FocalPoints *f, CGPoint thePoint){
if (thePoint.x == CGFLOAT_MAX) return;
if (!CGRectContainsPoint(f->boundingRect, thePoint)) return;
NSUInteger origCount = f->count; // |count| is typed as NSUInteger; |origCount|
NSUInteger newCount = origCount + 1; // and |newCount| should be consistent
// Greatly simplified by using realloc()
f->points = (CGPoint *) realloc(f->points, newCount * sizeof(CGPoint));
(f->points)[newCount-1] = thePoint;
f->count = newCount;
}
int main(int argc, const char * argv[])
{
@autoreleasepool {
// Just for testing; any point should be inside this rect
CGRect maxRect = CGRectMake(0, 0, CGFLOAT_MAX, CGFLOAT_MAX);
// Can initialize |points| to NULL; both realloc() and free() know what to do
FocalPoints fp = (FocalPoints){NULL, 0, maxRect};
int i;
for( i = 0; i < 10; i++ ){
FocalPointsAddPoint(&fp, CGPointMake(arc4random() % 100, arc4random() % 100));
NSLog(@"%@", NSStringFromPoint(fp.points[i]));
}
}
return 0;
}