【发布时间】:2019-04-03 19:10:03
【问题描述】:
我有以下带有灵活数组成员的结构:
struct test {
size_t sz;
const char str[];
};
现在我想分配一些内存来连续放置这个结构(比如在数组中)。问题是像struct test test_arr[] 这样的声明是未定义的行为。 6.7.2.1(p3):
具有多个命名成员的结构的最后一个成员 可能有不完整的数组类型;这样的结构(以及任何工会 可能递归地包含这样一个结构的成员) 不得是结构的成员或数组的元素。
我们知道malloc 返回的指针可以转换为指向任何具有基本对齐的对象类型的指针。考虑以下代码:
void *obj= malloc(100 * sizeof(struct test)); //enough memory
struct test *t1 = obj;
t1 -> sz = 2;
t1 -> str = {'a', 'b'};
struct test *t2 = (void *) (((char *) obj) + sizeof(struct test) + sizeof(char[2])); // non conforming
这样做的合规方式是什么?
【问题讨论】:
-
struct test *myText = malloc(size * sizeof (*myText))有什么问题? -
或者更重要的是,您要解决的实际问题是什么?
-
@Broman 没关系。但是这个怎么样:
struct test *myStruct = myText + 1; -
@Broman 从
inotify文件描述符文件中读取提供的缓冲区,其中struct inotify_event包含灵活的数组成员。
标签: c language-lawyer flexible-array-member