关于C#:返回指向文字(或常量)字符数组(字符串)的指针?


returning a pointer to a literal (or constant) character array (string)?

我知道这是错误的:

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

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

但是可以吗?

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


其实没关系。字符串文字通常分配在不可变的内存区域中,只要程序运行,该内存区域就一直可用。

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


就分配而言还可以:字符串文字隐式为static。返回非const指向文字的指针是不正确的。

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

1
return strdup("something else");

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


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

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

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

  • 如果函数可能返回文字字符串或malloc字符串,则必须非常注意内存管理。 free字符串文字可能会出现段错误。