gpt4 book ai didi

c - C中结构成员(指针与数组)的内存分配之间的差异

转载 作者:行者123 更新时间:2023-12-05 08:38:52 24 4
gpt4 key购买 nike

这两种分配内存的方式有什么有效的区别吗?

1.

typedef struct {
uint8_t *buffer;
} Container;

Container* init() {
Container* container = calloc(sizeof(Container), 1);
container->buffer = calloc(4, 1);
return container;
}

2.

typedef struct {
uint8_t buffer[4];
} Container;

Container* init() {
Container* container = calloc(sizeof(Container), 1);
return container;
}

据我所知,整个 Container 结构将被分配到堆中,buffer 将指向相同的结构。这是正确的吗?

最佳答案

有区别。

我将尝试说明示例。

正如其他人指出的那样:

  1. 第一个示例更难管理,但您可以随时更改缓冲区的大小。
  2. 第二个例子更容易管理(你不必关心单独释放缓冲区),但你只能有固定大小的缓冲区。

正如评论中所指出的:如果缓冲区是结构中的最后一个元素(如提供的示例中所示),则可以为缓冲区分配任何长度。

例如

int extra_bytes_needed = ...;
Container* container = calloc(sizeof(Container) + extra_bytes_needed, 1);

在图片的左侧 - 您的第一个案例。

在图片的右侧 - 您的第二个案例。

Left is first case, Right is second case.

关于c - C中结构成员(指针与数组)的内存分配之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61225421/

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