这可能是一个noob问题,但我甚至不知道谷歌的用途。
我试图实现一个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 :(得分:3)
您必须传递一个双指针才能在调用函数中反映更改的指针。
所以这是解决方案
static int getStat(std::string path, struct stat **stout)
...
getStat("/", &st);
在c++中,函数参数总是按值传递(引用除外)。这意味着在函数getStat()
中,stout
是指向函数调用中传递的struct的指针的副本。
因此,当新地址被分配给函数中的stout
时,这对something()
中{s}的结构的原始指针没有影响(stout
以内getStat()
只是st
中main()
的副本。
由于我们在c++,您可以使用@SomeProgrammerDude建议引用。
static int getStat(std::string path, struct stat& stout)
struct stat st;
getStat("/", st);