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

我知道这是错的:

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

…因为szLocal可以在函数返回后的某个时间被销毁。

但这样可以吗?

 char* getSomethingElse() { return "something else"; } 

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

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

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

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

 return strdup("something else"); 

不要忘记随后freestrdup是非ISO的,但几乎可以在任何地方使用(我相信MSVC除外)。

字符串文字的类型是const char * (参见下面的注释) static char[] ,但是不可变。 字符串文字表示指向静态分配内存的指针 。 因此:

  1. 返回一个这样的指针是完全没问题的。

  2. 你的函数返回类型必须const char*兼容,即返回类型char * 会给你至少一个警告,可能会在以后给你带来麻烦。

  3. 如果你的函数可以返回文字或malloc ed字符串,你必须非常小心内存管理。 free输入一个字符串文字可能会段错误。