gpt4 book ai didi

c - 是否允许返回具有灵活数组成员的结构?

转载 作者:太空宇宙 更新时间:2023-11-04 00:33:51 25 4
gpt4 key购买 nike

GCC 可以编译返回具有灵活数组成员的结构的函数。该标准在 6.7.2.1 中给出了如何处理此类结构的定义:

In most situations, the flexible array member is ignored. In particular, the size of the structure is as if the flexible array member were omitted except that it may have more trailing padding than the omission would imply.

由于具有灵活数组成员的结构的大小已知,根据 6.2.5 中给出的完整性定义,类型是完整的:

At various points within a translation unit an object type may be incomplete (lacking sufficient information to determine the size of objects of that type) or complete (having sufficient information). 37)

此外,6.5.2.2

The expression that denotes the called function 96) shall have type pointer to function returning void or returning a complete object type other than an array type.

因此返回具有灵活数组成员的struct应该是合法的。


如何修复下面的示例以使其正常工作(我需要具有灵活数组成员的堆栈分配结构):

#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);
}

最佳答案

是的,返回这样的值是有效的 C,但不会复制任何数组元素。自动变量的行为就好像它分配了一个长度为 1 的数组(因为 0 的数组长度在标准 C 中是无效的),但是访问 .data[0] 将有 UB -对象的实际 大小 可能包括 .data[0] 甚至更多连续元素 - 或者不包括。( C11 6.7.2.1p18 )。

不可能在标准 C 中定义一个在灵活数组成员中有任何内容的自动变量(扩展可能而且确实存在)!

赋值也是有效的(因此也会返回),但灵活的数组成员在赋值后将再次包含不确定的值(C11 6.7.2.1p25)。

关于c - 是否允许返回具有灵活数组成员的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58370519/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com