6

C语言返回栈空间的结构体

 3 years ago
source link: https://www.zenlife.tk/return-struct-without-malloc.md
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

C语言返回栈空间的结构体

2014-01-27

C语言中,返回在栈上分配的结构体是不安全的,因为函数的栈空间在返回之后就会被清除掉:

struct Ret* f() {
    Ret ret;
    return &ret;
}

如果想返回一个结构体,那么就需要调用malloc分配堆空间:

struct Ret* f() {
    Ret *ret = malloc(sizeof(struct Ret));
    return ret;
}

但是如果函数f本身是一个非常简单的函数,那么malloc分配一个返回值的代价就有点大。所以C语言常用的约定是参数既是输入也是输出,由调用函数分配空间:

void callee(struct Ret* ret) {
    // do something with ret
    return;
}
void caller() {
    Ret ret;
    callee(&ret);
}

有没有更屌的方式呢?回调!如果做一个CPS变换,传一个回调函数作为参数,那么被调函数栈空间仍然是有用的:

typedef void (Callback)(struct Ret *ret);
void callee(Callback callback) {
    struct Ret ret;
    callback(&ret);
}
void dummy(struct Ret *ret) {
    // process ret here, it's valid
}
caller(dummy);

这时的栈布局中: caller栈—- callee栈— Ret dummy栈—

有点奇技淫巧的感觉...


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK