You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C/C++中函数可返回结构体(值拷贝)却不能返回数组?原因探究

C/C++中函数返回局部结构体与数组的差异疑问

本文旨在澄清我在C/C中长期存在的困惑:若理解无误,是否在C/C中函数可通过值拷贝返回局部结构体,但无法返回局部数组?

以下是示例代码(注释中?标记的是我不确定的断言):

#include <stdio.h>

struct my_structure { int x; int y; };

struct my_structure foo(int a, int b)
{
    // 声明结构体变量(将在foo()的栈帧上为2个int分配4+4字节)
    struct my_structure ms;

    // 对结构体变量进行处理,示例如下:
    ms.x = a*a;
    ms.y = b*b;

    // ? 按值返回:将4+4字节拷贝至调用者(main)
    return ms; 
}

int main() {
    struct my_structure retval; // 在main()的栈帧上分配4+4字节
    retval = foo(10, 20); // ? 将foo()的局部结构体`ms`拷贝至上述分配的内存
    printf("%d, %d\n", retval.x, retval.y); // 100, 400
}

若理解正确,上述代码全程基于值和拷贝操作,无地址返回,因此这种返回结构体的方式是安全的,仅大型结构体效率不高。

关于函数局部数组,我查阅相关帖子得知无法返回,想知道为何不能像结构体那样将数组字节值从被调用栈拷贝至调用者栈?

我猜测:返回数组名时,C/C++编译器会隐式将其转为指向首元素的指针(数组退化为指针),返回的是数组基地址;变量超出作用域后该地址指向无效内存(非常危险)。而结构体返回时直接拷贝,不会退化为指针。请问该猜测是否正确?欢迎建议,感谢解答。

编辑:问题主要针对C语言,因C是C的超集,推测规则也适用于C?


内容的提问来源于stack exchange,提问作者First User

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 12:55:23