如何从函数返回栈对象并使用指针保存其地址?
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
相关产品推荐
相关产品推荐

