结构中的数组和结构的Malloc

jar*_*ryd 9 c malloc struct realloc

如何将malloc放在另一个结构体内?

我还想在结构中malloc一个项目数组,然后在需要时重新分配这个数组,这是如何正确完成的?

你能举个例子来说明一个结构,然后是上面的结构.

我有点不确定事情的顺序.

结构中的数组是否会被释放,然后结构本身,结构在创建时是否必须被malloced,然后它的字段被malloced /声明等?

Syl*_*sne 8

一个struct包括内部另一个struct被复制包含的,所以你不会有单独的malloc它.如果struct包含指向另一个的指针struct,那么您可以考虑动态分配内存.

struct Point2d
{
    float x;
    float y;
};

struct Rect
{
    struct Point2D a;
    struct Point2D b;
};

struct LinkedListNode
{
    struct LinkedListNode* next;
    int value;
};
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

realloc函数只执行浅复制,即复制指针值,但不复制指向对象.再一次,你如何处理它将取决于你的应用程序.