【发布时间】:2020-02-10 17:00:55
【问题描述】:
GCC 编译函数返回一个具有灵活数组成员的结构。该标准在 6.7.2.1 中给出了如何处理此类结构的定义:
在大多数情况下,灵活数组成员被忽略。在 特别是,结构的大小就像灵活的数组 成员被省略,除了它可能有更多的尾随填充比 遗漏意味着。
由于具有灵活数组成员的结构的大小已知,因此根据 6.2.5 中给出的完整性定义,类型是完整的:
在翻译单元内的不同点,对象类型可能是 不完整(缺乏足够的信息来确定 该类型的对象)或完整的(具有足够的信息)。 37)
还有,6.5.2.2
表示被调用函数的表达式 96) 应具有类型 指向返回 void 或返回完整对象类型的函数的指针 不是数组类型。
所以使用灵活的数组成员返回structs 应该是合法的。
如何修复下面的示例以使其正常工作(我需要具有灵活数组成员的堆栈分配结构):
#include <stdio.h>
struct test{
size_t sz;
char data[];
};
struct test get_test(void){
int sz = 5;
char data[5] = "test";
struct test test = {.sz = 5};
//How to copy char data[5] into the struct test test?
return test;
}
int main(void){
struct test tst = get_test();
printf("%s\n", tst.data);
}
【问题讨论】:
-
可以创建这样的对象,但不能访问灵活的数组元素。
-
如果你想访问灵活的成员,不要使用自动变量。来自
malloc或if availbleP99_FMALLOC家族。 -
您说:我需要具有灵活数组成员的堆栈分配结构。 标准说您可以创建这样的结构,但分配的大小不会包括灵活的任何空间数组成员。因此,这种结构很少有用。您可以处理指向此类结构的指针——它们需要动态分配(使用
malloc()等)才能有用(非空的灵活数组成员)。编译器可以免费提供扩展——GCC 可以。但是“语言律师”标签意味着您不关心此类扩展。 -
@JonathanLeffler 通过使用 GCC 的扩展如何做到这一点?我的意思是堆栈分配的具有初始化灵活数组成员的结构。
-
GCC 文档的后半部分关于 C 扩展和 Arrays of Length Zero。目前还不清楚您是否可以返回这样的值。如果它是静态分配的,你可以返回一个指向它的指针。
标签: c arrays language-lawyer flexible-array-member