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

时间:2011-01-29 11:10:36

标签: c

我知道这是错的:

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

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

但这可以吗?

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

3 个答案:

答案 0 :(得分:25)

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

另见when does c/c++ allocate string literals的答案。

答案 1 :(得分:7)

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

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

return strdup("something else");

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

答案 2 :(得分:4)

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

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

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

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