【发布时间】:2014-12-14 02:24:51
【问题描述】:
考虑如下结构:
typedef struct {
int arrCount;
int arr[1];
} SampleStruct, *PSampleStruct;
我知道arr 是一个 int 数组,需要在运行时动态分配内存,arrCount 需要保存元素的计数。但是,当我尝试使用 malloc 分配 10 个元素的内存时,编译器会抛出 arr must be a modifiable value 的错误。我无法确定如何为这样的数组分配内存。另外,我在很多 Windows 头文件中都看到过这样的例子,但是当我尝试实现它时,我完全迷失了。
【问题讨论】:
-
代替
int arr[1],使用int *arr。然后将 malloc 用于 arr -
@Neo 为 arr 使用 int 指针/单独分配将 arr 的生命周期与 SampleStruct 的生命周期分开,并且在非连续内存中。正确的方法是在单个 malloc/alloca 中分配一个指向 SampleStruct 的指针。
-
@Sanhadrin 您的“正确”方式并不严格符合 C,因为您最终访问的对象超出了 sizeof 对象。单独分配没有什么“不正确”的。我的回答提供了两者。 (并且使用偏移量“正确”地进行单一分配。)
-
谢谢吉姆。我指的是你在下面写的。
-
@Jim Balter 当标准本身定义不明确时,严格遵守标准在许多情况下是完全没有必要的,这就是其中之一。数组和指针的定义行为使其在功能上正确且可在地球上每个远程使用的编译器之间移植。 C 标准委员会说“这可行,但感觉很恶心”,并指出当实现要求使其完全可预测时,它是未定义的行为,这意味着您必须盲目地遵循标准才能看到任何问题。或者 - 这在哪个编译器上不起作用?
标签: c windows visual-c++ dynamic-memory-allocation