struct
, включенный в другой struct
, содержится в копии, поэтому вам не нужно отдельно выделять его. Если struct
содержит указатель на другой struct
, вы можете рассмотреть возможность динамического выделения памяти для него.
struct Point2d
{
float x;
float y;
};
struct Rect
{
struct Point2D a;
struct Point2D b;
};
struct LinkedListNode
{
struct LinkedListNode* next;
int value;
};
В struct Rect
элементы struct Point2D
вставляются в struct Rect
и вам не нужно динамически выделять для них память. Напротив, в struct LinkedListNode
на следующий элемент ссылается указатель, и память должна выделяться динамически.
Обе версии полезны в зависимости от ситуации. Не существует правильного способа управления памятью, это будет зависеть от вашего использования.
Такая же ситуация возникает и в случае с массивом. Если ваш массив имеет статический размер, то его можно напрямую включить в файл struct
. Однако, если размер может варьироваться, вы должны сохранить указатель в файле struct
.
struct Header
{
char magic[4];
unsigned int width;
unsigned int height;
};
struct Buffer
{
char* data;
unsigned int size;
unsigned int capacity;
};
struct Buffer* buffer_init()
{
struct Buffer* buffer = (struct Buffer*)malloc(sizeof(struct Buffer));
buffer->data = 0;
buffer->size = 0;
buffer->capacity = 0;
}
void buffer_grow(struct Buffer* buffer, size_t capacity)
{
if (capacity > buffer->capacity)
{
buffer->data = realloc(buffer->data, capacity);
buffer->capacity = capacity;
}
}
void buffer_append(struct Buffer* buffer, const char* data, unsigned int dataLen)
{
if (dataLen + buffer->size > buffer->capacity)
buffer_grow(MAX(dataLen + buffer->size, buffer->capacity * 2));
memcpy(buffer->data + buffer->size, data, dataLen);
buffer->size += dataLen;
}
Функция realloc
делает только поверхностную копию, то есть копируется значение указателя, но не указанный объект. Еще раз, как вы с этим справитесь, будет зависеть от вашего приложения.
person
Sylvain Defresne
schedule
28.03.2011