返回指向局部结构(Returning pointer to a local structure)

2019-07-19 14:09发布

它是安全的指针返回到C的局地结构? 我的意思是这样


struct myStruct* GetStruct()  
{  
    struct myStruct *str = (struct myStruct*)malloc(sizeof(struct myStruct));  
    //initialize struct members here  
    return str;
}  

安全?
谢谢。

Answer 1:

在你的代码,不必返回一个指向局部结构。 要返回一个指针到一个malloc()'d缓冲器将驻留在所述堆。

因此,绝对安全。

但是,主叫方(或主叫方呼叫方或主叫方的主叫方的被叫方,你的想法),然后将负责调用free()。

什么是不安全的是这样的:

char *foo() {
     char bar[100];
     // fill bar
     return bar;
}

作为一个返回指针的内存块是在栈上 - 是一个局部变量 - 和,在返回时,该内存将不再有效。

Tinkertim指的是“静态分配的酒吧和提供互斥”。

当然:

char *foo() {
    static char bar[100];
    // fill bar
    return bar;
}

这将工作,它会返回一个指向静态分配的缓冲区吧。 静态分配意味着,酒吧是一个全球性的。

因此,上述将无法在多线程环境中工作,其中有可能会并发呼叫foo() 您将需要使用某种类型的同步原语,以确保两次调用的foo()不影响对方。 有很多很多,同步原语&可用的模式-与一个事实,即问题是关于组合malloc() ED缓冲器把这种讨论超出范围为这个问题。

需要明确的是:

// this is an allocation on the stack and cannot be safely returned
char bar[100];

// this is just like the above;  don't return it!!
char *bar = alloca(100);

// this is an allocation on the heap and **can** be safely returned, but you gotta free()
malloc(100);

// this is a global or static allocation of which there is only one per app session
// you can return it safely, but you can't write to it from multiple threads without
// dealing with synchronization issues!
static char bar[100];


Answer 2:

认为它是这样的:你可以从一个函数返回一个指针,如果分配给该指针的内存是不是局部的功能(即功能的该实例的堆栈帧 - 要准确)



文章来源: Returning pointer to a local structure