GCC 编译函数返回一个具有灵活数组成员的结构。该标准在 6.7.2.1 中给出了如何处理此类结构的定义:
在大多数情况下,灵活数组成员被忽略。特别是,结构的大小就像省略了柔性数组成员一样,只是它可能具有比省略所暗示的更多的尾随填充。
由于具有灵活数组成员的结构的大小是已知的,因此根据 6.2.5 中给出的完整性定义,该类型是完整的:
在翻译单元内的不同点,对象类型可能是不完整的(缺乏足够的信息来确定该类型对象的大小)或完整的(具有足够的信息)。37)
另外,6.5.2.2
表示被调用函数的表达式 96) 应具有指向返回 void 或返回数组类型以外的完整对象类型的函数的类型指针。
所以struct
用灵活的数组成员返回 s 应该是合法的。
如何修复下面的示例以使其正常工作(我需要具有灵活数组成员的堆栈分配结构):
#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);
}