Функция компиляции 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);
}