假设我有如下结构:
struct line {
int length;
char contents[];
};
struct line *thisline = (struct line *) malloc (sizeof (struct line) + this_length);
thisline->length = this_length;
contents
的分配空间在哪里?在堆中或length
之后的即将到来的地址?
答案 0 :(得分:6)
根据定义,灵活数组contents[]
位于变量大小的结构内,位于length
字段之后,因此您就在malloc
-ing空间中,因此当然{ {1}}位于您p->contents
- 的区域内(因此在堆内)。
答案 1 :(得分:4)
两者。它位于堆中,因为thisline
指向堆中的已分配缓冲区。您在malloc()
调用中请求的额外大小用作thisline->contents
的分配区域。因此,thisline->contents
在thisline->length
之后开始。
答案 2 :(得分:0)
NO 隐式分配内容空间。
struct line foo;
// the size of foo.contents in this case is zero.
始终通过使用指针来引用它。 例如,
struct line * foo = malloc( sizeof(foo) + 100 * sizeof(char) );
// now foo.contents has space for 100 char's.