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

如何从函数返回栈对象并使用指针保存其地址?

C语言中返回栈对象并保存其地址的问题

核心问题

普通C函数不能返回内部栈对象的地址——函数返回时,对应的栈帧会被销毁,栈上的局部变量也会随之失效,返回这类地址属于未定义行为。

错误示例代码

int* fun(void) {
    int tmp = -1;
    return &tmp; // 错误:返回栈内局部变量的地址,函数返回后tmp已销毁
}

常规解决方案:堆内存分配

通常的正确做法是在堆上分配内存,这样内存不会随函数栈帧销毁,但必须由调用者手动释放,否则会造成内存泄漏:

int* fun(void) {
    int* tmp = malloc(sizeof(int));
    if (tmp != NULL) {
        *tmp = -1;
    }
    return tmp; // 注:原示例代码此处写错,应返回堆指针tmp,而非&tmp(栈上指针变量的地址)
}

栈分配的替代方案:复合字面量

为了避免手动管理堆内存,我们可以利用C语言的复合字面量特性,在调用栈上创建对象并获取其地址,无需手动释放:

基础数据类型示例

int function_int(void) {
    return -1;
}

// 用宏包装复合字面量,直接获取栈对象的地址
#define function_int_wrapper()  &(int){function_int()}
int* ptr = function_int_wrapper();

结构体示例

typedef struct {
    int id;
} st;

st function_st(void) {
    return (st){-1};
}

#define function_st_wrapper()   &(st){function_st()}
st* ptr = function_st_wrapper();

这里通过(类型){初始化表达式}的复合字面量语法,在调用处的栈上创建对象,再取其地址。但遇到一些仅包含单个int成员的结构体时,这种写法却无法正常生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 02:01:10