返回一个指向文字(或常量)字符数组(字符串)的指针?

Joh*_*ick 27 c

我知道这是错的:

char* getSomething() {  
    char szLocal[5];  
    /* put something in the char array somehow */  
    return szLocal;  
}  
Run Code Online (Sandbox Code Playgroud)

...因为szLocal可以在函数返回后的某个时候被销毁.

但这样可以吗?

char* getSomethingElse() {  
    return "something else";  
}  
Run Code Online (Sandbox Code Playgroud)

Rom*_*kov 25

那实际上没问题.字符串文字通常分配在不可变的内存区域中,只要程序正在运行,该区域仍然可用.

另请参阅c/c ++何时分配字符串文字的答案.

  • 字符串文字保证在应用程序的范围内存在.它可能不在只读/不可变内存中,但它们保证在应用程序的生命周期内存在,因此返回一个指针就可以了. (6认同)

Fre*_*Foo 7

在分配方面没问题:字符串文字是隐含的static.将非const指针返回到文字是不正确的.

如果要返回可修改的(非const)字符串,请将其声明为a static char[].或者更好,返回一份副本:

return strdup("something else");
Run Code Online (Sandbox Code Playgroud)

不要忘记free事后.strdup是非ISO,但几乎可以在任何地方使用(除了MSVC,我相信).

  • @romkyns:GCC 4.5 甚至没有抱怨 `-Wall`:正如 Jens Gustedt 在 nominolo 的答案下面指出的那样,文字不是 `const`。(G++ 抱怨,但仍然编译模块,然后我们就脱离了 C 世界。) (2认同)

nom*_*olo 5

字符串文字的类型是static char[],但不可变。字符串文字表示指向静态分配内存的指针。所以:

  1. 返回这样一个指针是完全可以的。

  2. 你的函数的返回类型应该与 兼容const char*,即返回类型char *可能会给你带来麻烦。

  3. 如果您的函数可能返回文字或malloc字符串,则您必须非常小心内存管理。 free字符串文字可能会出现分段错误

  • @larsman:不,不幸的是,由于历史原因,它的类型不是“const”限定的。但你无权更改它:(( 因此声明返回值 `const` 当然是一个好主意,但语言不强制这样做。 (3认同)
  • 实际上,该类型是“static const char[]”,即更接近“const char *const”。您不能增加或减少文字。 (2认同)