我知道这是错误的:
char* getSomething() { char szLocal[5]; /* Put something in the char array somehow */ return szLocal; }
.因为 szLocal 可以在函数返回后的某个时间被销毁。但是这样可以吗?
char* getSomethingElse() { return "something else"; }
bqjvbblv1#
其实没关系。字符串文字通常分配在一个不可变的内存区域中,只要程序运行,该区域就一直可用。请参阅when does c/c++ allocate string literals的答案。
mrzz3bfm2#
在分配方面是可以的:字符串字面量隐式地为static。返回一个非const的指针到一个文本是不行的。如果你想返回一个可修改的(非const)字符串,声明它为static char[]。或者更好,返回一个副本:
static
const
static char[]
return strdup("something else");
别忘了以后再做free。strdup是非ISO的,但几乎在任何地方都可以使用(除了MSVC,我相信)。
free
strdup
acruukt93#
字符串文字的类型是static char[],但不可变。字符串字面量表示指向静态分配内存的 * 指针 *。因此:1.返回一个这样的指针是非常好的。1.你的函数的返回类型应该与const char*兼容,也就是说,返回类型char *可能会给你带来给予麻烦。1.如果你的函数可能同时返回一个文字或malloc艾德字符串,你必须非常小心内存管理。free ing a string literal probably will segmentation fault .
const char*
char *
3条答案
按热度按时间bqjvbblv1#
其实没关系。字符串文字通常分配在一个不可变的内存区域中,只要程序运行,该区域就一直可用。
请参阅when does c/c++ allocate string literals的答案。
mrzz3bfm2#
在分配方面是可以的:字符串字面量隐式地为
static
。返回一个非const
的指针到一个文本是不行的。如果你想返回一个可修改的(非
const
)字符串,声明它为static char[]
。或者更好,返回一个副本:别忘了以后再做
free
。strdup
是非ISO的,但几乎在任何地方都可以使用(除了MSVC,我相信)。acruukt93#
字符串文字的类型是
static char[]
,但不可变。字符串字面量表示指向静态分配内存的 * 指针 *。因此:1.返回一个这样的指针是非常好的。
1.你的函数的返回类型应该与
const char*
兼容,也就是说,返回类型char *
可能会给你带来给予麻烦。1.如果你的函数可能同时返回一个文字或malloc艾德字符串,你必须非常小心内存管理。
free
ing a string literal probably will segmentation fault .