C 复杂数据类型的内存分配

C 复杂数据类型的内存分配,c,memory-management,malloc,typedef,C,Memory Management,Malloc,Typedef,我想为下面这样的结构分配内存 typedef struct { int *buffer; int length; int dsn; int handle; } myStr; 哪一个是正确的 myStr *pStr = malloc(sizeof(myStr)+lenOfBuff); 或 我在一些例子中看到使用第一个,但对我来说似乎有点奇怪。它是否必须同时为数据缓冲区分配内存???您必须分别为每个数据分配内存 #include <stdlib.h> myStr *pStr = m

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

typedef struct {
int *buffer;
int length;
int dsn;
int handle;
} myStr;
哪一个是正确的

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


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

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

#include <stdlib.h>

myStr *pStr = malloc(/* ... */);
pStr->buffer = malloc(/* ... */);
#包括
myStr*pStr=malloc(/*…*/);
pStr->buffer=malloc(/*…*/);

C中有一个例外:。

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

有时你会看到最后一个字段的数组,它是一个“聪明”的方法,它使用一个结构的单个分配,从而传递给Maloc的大小根据数组中的元素的数量而变化,在许多C++循环中你不会看到这个。在这种情况下,只需一个分配就可以获得以下的形式:C++中未定义的表单,尽管您会看到它被一些实现使用和支持:

struct t_array {
  size_t count;
  t_thing at[1]; // << variable length array, with t_array.count elements
};
struct\u数组{
大小/数量;
在[1];//
如果你想使用第一种情况。但是我强烈建议你不要这样做,如果你不知道为什么会这样做。

视情况而定

如果要在创建后更改缓冲区的长度,则需要单独分配。否则,可以在单个
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;
}

在C++中,我会把它们都当作错误的。当然,我在嵌入式系统编程示例中看到了它们上面的例子。我想知道对于灵活数组成员是否有任何的理由?这是错误的。你不必分开分配,看看解开的答案。我不确定这个方法是否严格一致,导致填充位。为什么是第一个不正确?(另外,在大小为1的数组上不能使用大于0的索引)。请注意,在C99中,正式引入的最后一个元素的灵活数组是因为人们经常使用这个习惯用法。请参阅.@R.MartinhoFernandes这不是我所说的said@justin哦,对不起,我的意思是为什么第一个不正确?(不是,请参阅unwind的答案)沙赫巴兹问题是两个标记——C++中不支持灵活数组(不确定C++ 11中是否改变了)
typedef struct {
  int length;
  int dsn;
  int handle;
  int buffer[];
} myStr;
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;
}