来自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*的函数怎么办?
这四个是等价的,尤其是前三个 - 编译器可能会将它们编译为完全相同的代码.所以我会选择最后一个,因为它更小.
话虽如此 - 你要返回一个const char*,而不是char*,所以这个特殊的代码可能会破坏一切,具体取决于你如何使用它(如果它完全编译,你可以强迫它).问题是,您正在查找指向未动态分配的字符串的指针,而是指向可执行映像的一部分.所以修改它可能很危险.
作为一个更一般的规则,永远不要返回指向堆栈上分配的东西的指针(即不是使用new或malloc创建的),因为一旦函数结束,该变量的范围也会结束,被破坏,所以你得到一个指向无效(释放)内存.