Un struct
incluido dentro de otro struct
es contenida por copia, por lo que no tendría que malloc separado él. Si el struct
contiene un puntero a otro struct
, entonces puede considerar asignarle memoria dinámicamente.
struct Point2d
{
float x;
float y;
};
struct Rect
{
struct Point2D a;
struct Point2D b;
};
struct LinkedListNode
{
struct LinkedListNode* next;
int value;
};
En struct Rect
, el elemento struct Point2D
se insertan en struct Rect
y usted no tiene que asignar dinámicamente la memoria para ellos. Por el contrario, en el struct LinkedListNode
, el puntero hace referencia al siguiente elemento y la memoria debe asignárseme dinámicamente.
Las dos versiones son útiles, dependiendo de la situación. No hay una forma correcta de administrar la memoria, dependerá de su uso.
En el caso de una matriz, esta es la misma situación, ya sea que su matriz tenga un tamaño estático, y luego se puede incluir directamente en struct
o su tamaño puede variar, en cuyo caso tendrá que almacenar en el puntero en el 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;
}
La función realloc
sólo se hace una copia superficial, es decir, se copia el valor del puntero, pero no el objeto puntiagudo. Una vez más, la forma de lidiar con esto dependerá de su aplicación.
Gracias. Quiero tener una matriz dinámica dentro de una estructura.Entonces, ¿qué pasa si struct Point2D tiene una matriz por alguna razón y luego creamos un Point2D dentro de una estructura rect, ¿cómo se hace esto? – jarryd