如何使用1个元素声明数组时动态分配内存

时间:2014-10-18 18:19:12

标签: c windows visual-c++ dynamic-memory-allocation

考虑如下结构:

typedef struct { int arrCount; int arr[1]; } SampleStruct, *PSampleStruct;

我知道arr是一个在运行时需要动态内存分配的int数组,而arrCount需要保存元素的数量。但是当我尝试使用malloc分配10个元素的内存时,编译器会抛出arr must be a modifiable value的错误。我不知道如何为这样的数组分配内存。另外,我在很多Windows标题中看到了这样的例子,但是当我试图实现它时,我完全迷失了。

3 个答案:

答案 0 :(得分:1)

虽然arr[1] 不是指针,但PSampleStruct是。{你可以这样做:

PSampleStruct ss10arr = malloc(sizeof (*ss10arr) + (sizeof(ss10arr->arr) * 9))会使arr[0]arr[9]生效。

请注意,这仅适用,因为arr位于结构的 end

另请注意,如果您尝试访问后续元素,某些编译器选项(如带有glibc和gcc的-D_FORTIFY_SOURCE)会抱怨,因为它会将此检测为溢出。

答案 1 :(得分:0)

以这种方式执行操作时,通常不会分配数组本身 - 使用malloc / alloca分配结构,其大小为sizeof(SampleStruct)+ arr []的分配大小 - 然后是arr []用于索引已分配的内存。

参见GCC's description of zero-length arrays - 长度为1的数组应该相同,但内存使用意图更清楚。

答案 2 :(得分:-1)

SampleStruct* pstruct = malloc(offsetof(SampleStruct, arr) + 10 * sizeof *pstruct->arr);

将在arr中分配一个指向SampleStruct的指针,其中包含10个元素。这几乎适用于所有实施,但并不严格符合要求。要严格遵守,请更改

int arr[1];

int* arr;

并且做:

SampleStruct* pstruct = malloc(sizeof *pstruct);
pstruct->arr = malloc(10 * sizeof *pstruct->arr);

编辑:如果您使用的是C99(或更高版本)编译器(遗憾的是,微软不是),您可以使用灵活阵列。变化

int arr[1];

int arr[];

然后再做

SampleStruct* pstruct = malloc(sizeof *pstruct + 10 * sizeof *pstruct->arr);