它是安全的指针返回到C的局地结构? 我的意思是这样
struct myStruct* GetStruct()
{
struct myStruct *str = (struct myStruct*)malloc(sizeof(struct myStruct));
//initialize struct members here
return str;
}
安全?
谢谢。
它是安全的指针返回到C的局地结构? 我的意思是这样
struct myStruct* GetStruct()
{
struct myStruct *str = (struct myStruct*)malloc(sizeof(struct myStruct));
//initialize struct members here
return str;
}
安全?
谢谢。
在你的代码,不必返回一个指向局部结构。 要返回一个指针到一个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];
认为它是这样的:你可以从一个函数返回一个指针,如果分配给该指针的内存是不是局部的功能(即功能的该实例的堆栈帧 - 要准确)