我想为下面的结构分配内存
typedef struct {
int *buffer;
int length;
int dsn;
int handle;
} myStr;
哪一个是正确的?
myStr *pStr = malloc(sizeof(myStr)+lenOfBuff);
或者
myStr *pStr = malloc(sizeof(myStr));
我在一些使用第一个示例的示例中看到了,但这对我来说似乎有点奇怪。是否必须同时为data Buffer分配内存??
我想为下面的结构分配内存
typedef struct {
int *buffer;
int length;
int dsn;
int handle;
} myStr;
哪一个是正确的?
myStr *pStr = malloc(sizeof(myStr)+lenOfBuff);
或者
myStr *pStr = malloc(sizeof(myStr));
我在一些使用第一个示例的示例中看到了,但这对我来说似乎有点奇怪。是否必须同时为data Buffer分配内存??
这取决于。
如果要在创建后更改缓冲区的长度,则需要单独分配。如果没有,您可以在一次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;
}
您必须分别为每个数据分配内存。
#include <stdlib.h>
myStr *pStr = malloc(/* ... */);
pStr->buffer = malloc(/* ... */);
C中有一个例外:灵活数组成员。
第二个是正确的。第一个是不正确的。缓冲区中的数据将是一个单独的分配。
有时你会在最后一个字段上看到一个数组,这是一个“聪明”的意思是对结构使用单个分配,其中传递给 malloc 的大小根据数组中元素的数量而变化——你不会在很多情况下看到这一点C++ 圈子。在这种情况下,你可以只使用一个分配——以下形式在 C++ 中是未定义的,尽管你会看到它被一些实现使用和支持:
struct t_array {
size_t count;
t_thing at[1]; // << variable length array, with t_array.count elements
};
在 C 中,您可以使用灵活的数组,尽管您的 C++ 编译器仅通过扩展支持该功能。
typedef struct {
int length;
int dsn;
int handle;
int buffer[];
} myStr;
如果你想使用第一种情况。但我强烈建议不要这样做,如果你不知道足够多,你可以弄清楚为什么这会起作用。