2012-09-05 90 views
0

我想为strucs分配这样下面内存分配复杂数据类型

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

哪一个是正确的内存?

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

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

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

+2

在C++中,我会放弃既是错误的。 –

回答

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; 
} 
3

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

#include <stdlib.h> 

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

在C:flexible array members中有个例外。

+0

当然,但我在嵌入式系统编程示例中看到他们的确如上所述。我想知道是否有任何原因 – KasraM

+0

也许对于灵活的阵列成员? http://stackoverflow.com/questions/688471/variable-sized-struct-c – md5

+1

这是错误的。你不需要分开分配,看到放松的答案。 –

2

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

有时你会看到在最后字段,它是一个“聪明”的阵列装置,使用一个单一的分配的结构,由此传递给malloc的大小根据数组中元素的数目而变化 - 你在很多C++圈子中都看不到这个。在这种情况下,您可以通过只有一个分配得到 - 下面的表格是用C++不确定,但你会看到它使用并支持一些实现:

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

在C语言中,你可以使用灵活数组,尽管你的C++编译器只支持扩展。

+0

为什么第一个不正确? (另外,您不能在大小为1的数组上使用大于0的索引)。 –

+0

请注意,在C99中,最后一个元素的灵活数组正式引入,因为人们很多地使用了这个习惯用法。看[这个问题](http://stackoverflow.com/q/246977/912144)。 – Shahbaz

+0

@ R.MartinhoFernandes那不是我说的 – justin

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

如果您想使用第一种情况。但我强烈建议不要这样做,如果你不知道足够多,你可以弄清楚为什么这会起作用。