2017-08-24 34 views
0

这可能是一个noob问题,但我甚至不知道该怎么去google。当函数耗尽时,struct被归零了?

我试图实现一个fuse文件系统,并且在传递结构时遇到了问题,可能是因为我对C++没有经验。

static int getStat(std::string path, struct stat *stout) 
{ 
    ... 
    struct stat *st = new struct stat(); 
    lstat(path.c_str(), st); 
    // lstat correctly filled st according to gdb 
    ... 
    stout = st; 
    // values are correctly copied to stout according to gdb 
} 

void something() 
{ 
    struct stat *st = new struct stat(); // this might also be stack allocated by fuse, idk 
    getStat("/", st); 
    // but st is all zero now !? 
} 

我错过了什么?我如何正确地将数据从功能中取出?

+0

不确定你是否忽略了它,但请注意'getStat'必须返回一个值,否则你有UB。 – NathanOliver

+0

如果在分配和重新分配给“stout”之前没有“删除”结构,那么存在潜在的内存泄漏。 –

+0

不要在堆上分配统计信息(不要新建)!在堆栈上分配并将地址传递给lstat。 – 2017-08-24 15:40:09

回答

3

您必须传递一个双指针才能够在调用函数中反映已更改的指针。

所以这是解决

static int getStat(std::string path, struct stat **stout) 
... 
getStat("/", &st); 

,函数参数总是按值传递(除引用)。这意味着在函数getStat()中,stout是在函数调用中传递的指向struct的指针的副本。

所以,当新的地址是在函数里分配给stout,这对原来的指针没有影响到something()结构(自内getStat()stout只是内main()st复印件)。

由于我们在您可以使用@SomeProgrammerDude建议的引用。

static int getStat(std::string path, struct stat& stout) 
struct stat st; 
getStat("/", st); 
+1

为什么在C++编程时使用“双指针”? C++有通过引用。 –

+0

它只是解释问题。 –

+0

请注意,该问题被标记为** C++ **而不是C.在C++中,您不需要在C中模拟传递引用,因为C++具有本地引用。 –