A 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
делает только поверхностную копию, то есть копируется значение указателя, но не указательобъект.Еще раз, как вы справитесь с этим, будет зависеть от вашей заявки.