gpt4 book ai didi

c - 结构中的数组和结构的 Malloc

转载 作者:太空狗 更新时间:2023-10-29 16:53:35 25 4
gpt4 key购买 nike

一个 malloc 如何分配一个位于另一个结构中的结构?

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

能否请您举一个先声明一个结构然后再声明上面的例子。

我有点不确定事物的顺序。

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

最佳答案

包含在另一个 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;
};

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 函数只做浅拷贝,即指针值被复制,而不是指向的对象。再一次,你如何处理它取决于你的应用程序。

关于c - 结构中的数组和结构的 Malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5465759/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com