返回指向文字(或常量)字符数组(字符串)的指针?
我知道这是错的:
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");
不要忘记随后free
。 strdup
是非ISO的,但几乎可以在任何地方使用(我相信MSVC除外)。
字符串文字的类型是 (参见下面的注释) const char *
static char[]
,但是不可变。 字符串文字表示指向静态分配内存的指针 。 因此:
-
返回一个这样的指针是完全没问题的。
-
你的函数返回类型
必须与const char*
兼容,即返回类型char *
会给你至少一个警告,可能会在以后给你带来麻烦。 -
如果你的函数可以返回文字或
malloc
ed字符串,你必须非常小心内存管理。free
输入一个字符串文字可能会段错误。