2016-09-24 1 views
1

Мне нужна помощь в назначении школы, в частности, с изменением размера памяти, выделенной для указателя WITHOUT realloc.C - массив структурных указателей с динамическим размером без использования realloc?

У меня есть следующие декларации в моей программе.

struct GraphicElement 
{ 
    enum{ SIZE = 256 }; 
    unsigned int numLines; 
    Line* pLines; 
    char name[SIZE]; 
}; 

typedef struct 
{ 
    unsigned int numGraphicElements; 
    GraphicElement* pElements; 
}VectorGraphic; 

VectorGraphic Image; 

Как только программа запустится, я добавлю больше графических элементов в pElements.

Например, после 5 итераций памяти pElements должно быть что-то вроде этого:

[GraphicElement 0] [GraphicElement 1] ... [GraphicElement 4]


Для функции AddGraphicElement (VectorGraphic * Г) у меня есть этот код (с некоторыми линиями удалены для удобства чтения):

vg->pElements = (GraphicElement*)realloc(vg->pElements, sizeof(GraphicElement)*(vg->numGraphicElements+1)); 

//Then I assign inputs from user into the members of the struct at vg->pElements[vg->numGraphicElements] 

vg->numGraphicElements++; 

Это работает, НО в соответствии с инструкциями моего профессора мне разрешено использовать malloc и free-no realloc. К сожалению, единственный способ, которым я сделал эту работу, - это realloc.

Может ли кто-нибудь указать мне в правильном направлении, чтобы реализовать это, используя только malloc?

Спасибо!

+0

Не набрасывайте 'malloc()'/'realloc()'. – melpomene

ответ

2

Если вы не можете использовать realloc, но malloc и free разрешено, вы можете заменить вызов со следующей, менее эффективной, последовательности:

void *newData = malloc(newSize); 
memcpy(newData, oldData, oldSize); 
free(oldData); 

Внутренне realloc делает то же самое, но он делает это более эффективно. В отличие от пользовательской программы, realloc знает фактический размер куска динамической памяти, поэтому он проверяет, newSize <= actualSize, чтобы избежать перераспределения. Когда actualSize недостаточно, realloc делает то же, что и выше. realloc имеет дополнительную логику для решения ситуаций, когда размер должен сокращаться, но в вашей ситуации это не применяется.

+1

Технически 'realloc' делает' memcpy (newData, oldData, min (oldSize, newSize)) ', но это не имеет никакого значения в этом случае, потому что размер просто продолжает расти. – melpomene

+0

@melpomene Правильно, 'realloc' должен быть умнее этого. Этого должно быть достаточно для OP, хотя, потому что для его распределения памяти программы является улица с односторонним движением. – dasblinkenlight

+0

@melpomene Если вы хотите быть техническим, то для реализации реального realloc также потребуется вернуть исходный указатель на отказ выделения и избежать шага 'memcpy', если исходный указатель является нулевым указателем. – jamesdlin