复杂数据类型的内存分配

时间:2012-09-05 12:12:23

标签: c memory-management malloc typedef

我想为下面的结构分配内存

typedef struct {
int *buffer;
int length;
int dsn;
int handle;
} myStr;

哪一个是正确的?

myStr *pStr = malloc(sizeof(myStr)+lenOfBuff);

myStr *pStr = malloc(sizeof(myStr));

我在一些使用第一个的例子中看到,但对我来说似乎有点奇怪。是否必须同时为数据缓冲区分配内存?

4 个答案:

答案 0 :(得分:4)

取决于。

如果要在创建后更改缓冲区的长度,则需要单独分配。如果没有,您可以在一次malloc()调用中共同分配这两个块,这可能会稍微提高效率。

共同分配看起来像这样:

myStr * mystr_create(size_t initial_size)
{
  myStr *ptr;

  ptr = malloc(sizeof *ptr + initial_size * sizeof *myStr->buffer);
  ptr->buffer = (int *) (ptr + 1);
  ptr->length = initial_size;
  ptr->dsn = ... something ...
  ptr->handle = ... something ... *

  return ptr;
}

答案 1 :(得分:3)

您必须分别为每个数据分配内存。

#include <stdlib.h>

myStr *pStr = malloc(/* ... */);
pStr->buffer = malloc(/* ... */);

C中有一个例外:flexible array members

答案 2 :(得分:2)

第二个是正确的。第一个是不正确的。缓冲区中的数据将是一个单独的分配。

有时您会在 last 字段中看到一个数组,这是一个“聪明”意味着对结构使用单个分配,因此传递给malloc的大小根据元素的数量而变化数组 - 你不会在很多C ++圈子里看到这个。在这种情况下,只需一次分配就可以获取 - 以下形式在C ++中是未定义的,尽管您会看到它被某些实现使用和支持:

struct t_array {
  size_t count;
  t_thing at[1]; // << variable length array, with t_array.count elements
};

在C中,您可以使用灵活的数组,尽管您的C ++编译器仅通过扩展支持该功能。

答案 3 :(得分:0)

typedef struct {
  int length;
  int dsn;
  int handle;
  int buffer[];
} myStr;

如果你想使用第一种情况。但我强烈建议不要这样做,如果你不够了解,你可以理解为什么这会起作用。