考虑如下结构:
typedef struct {
int arrCount;
int arr[1];
} SampleStruct, *PSampleStruct;
我知道arr
是一个在运行时需要动态内存分配的int数组,而arrCount
需要保存元素的数量。但是当我尝试使用malloc分配10个元素的内存时,编译器会抛出arr must be a modifiable value
的错误。我不知道如何为这样的数组分配内存。另外,我在很多Windows标题中看到了这样的例子,但是当我试图实现它时,我完全迷失了。
答案 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);