在C中,声明并初始化一个小函数中的变量或只返回一个响应

Ada*_*umb 2 c memory-leaks

来自PHP背景,我习惯于编写返回字符串的小函数(或来自另一个函数的响应),如下所示:

function get_something(){
    return "foo";
}
Run Code Online (Sandbox Code Playgroud)

但是,我是C的新手,我正试图想办法如何做一些像这样的基本事情.

人们可以检查以下类似的功能,并告诉我它们有何不同,哪一个是最好/最干净的?

char *get_foo(){
    char *bar;
    bar = "bar";
    return bar;
}

char *get_foo(){
    char *bar = "bar";
    return bar;
}

char *get_foo(){
    char *bar = NULL;
    bar = "bar";
    return bar;
}

char *get_foo(){
    return "bar";
}
Run Code Online (Sandbox Code Playgroud)

这些功能之间有什么区别,还是风格问题?

另一件事.如果我有两个函数而另一个调用另一个函数,这可以吗?

char *get_foo(){
    return "bar";
}

char *get_taz(){
    return get_foo();
}
Run Code Online (Sandbox Code Playgroud)

更新:如果get_foo()没有返回const char*,这些函数将如何更改?如果get_foo()调用另一个具有不同长度的char*的函数怎么办?

gga*_*ett 5

这四个是等价的,尤其是前三个 - 编译器可能会将它们编译为完全相同的代码.所以我会选择最后一个,因为它更小.

话虽如此 - 你要返回一个const char*,而不是char*,所以这个特殊的代码可能会破坏一切,具体取决于你如何使用它(如果它完全编译,你可以强迫它).问题是,您正在查找指向未动态分配的字符串的指针,而是指向可执行映像的一部分.所以修改它可能很危险.

作为一个更一般的规则,永远不要返回指向堆栈上分配的东西的指针(即不是使用new或malloc创建的),因为一旦函数结束,该变量的范围也会结束,被破坏,所以你得到一个指向无效(释放)内存.