C语言中返回含数组的结构体是否可行?是否为未定义行为?
C语言中返回包含数组的结构体相关问题解答
能否从函数返回包含数组的结构体?
完全可以,这是C语言标准明确允许的行为,不属于未定义行为。C语言标准是否会影响结果?
从C89开始,所有后续的C语言标准(包括C99、C11、C17等)都支持结构体的返回操作,规则没有变化,符合标准的编译器都会正确处理这种场景。示例代码的拷贝行为分析
你的示例代码中,struct_t s2 = func();会执行完整的结构体值拷贝:- 函数
func里的局部变量s1是栈上的结构体实例,它的arr数组是直接嵌入在结构体内存中的(不是指针)。 - 当返回
s1时,编译器会把s1的所有成员(包括arr数组的每一个元素、number变量)完整复制到main函数中s2的内存空间里。 - 最终
s2.arr是独立的数组,和s1.arr内存地址不同,但内容完全一致(也就是实现了所谓的“深拷贝”);s2.number也会被正确复制为0。
不存在只拷贝
number或者s2.arr指向s1.arr内存的情况,更不是未定义行为。- 函数
内容的提问来源于stack exchange,提问作者nirki
相关产品推荐
相关产品推荐

