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字符串文字:它们在哪里?
-
在第一个示例中,szLocal并非在"之后"被销毁,而是恰好在函数返回的那一刻被销毁,因此返回的指针已经无效。 的确,它指向的数据将在"一段时间"内保持不变,但是函数堆栈帧已被释放,并且该内存可供需要创建局部变量或调用另一个函数的任何人使用。
其实没关系。字符串文字通常分配在不可变的内存区域中,只要程序运行,该内存区域就一直可用。
另请参见有关c / c ++何时分配字符串文字的答案。
-
我同意罗姆金斯。但是,我们不知道您正在使用什么系统?可能有一些不起作用。为了您自己的安心,您可以尝试有目的地盖在我们建议字符串不存在的内存上。即堆栈。通过声明和辅助一些局部变量,或使用一些参数调用其他函数,来获得堆栈上的内容。理想情况下,请使用本身声明并分配一些局部变量的一些参数调用另一个函数。
-
天哪,这个地方很棒。 10分钟内有10条有用的回复。谢谢大家(我在使用vs2010 btw的x64视窗上)
-
字符串文字保证在应用程序范围内有效。它可能不在只读/不可变内存中,但是可以保证它们在应用程序的生存期内都存在,因此返回指向一个的指针就可以了。
就分配而言还可以:字符串文字隐式为static。返回非const指向文字的指针是不正确的。
如果要返回可修改的(非const)字符串,请将其声明为static char[]。或者更好的是,返回副本:
1
| return strdup("something else"); |
不要忘了之后free。 strdup是非ISO的,但几乎可以在任何地方使用(我相信MSVC除外)。
-
strdup在msvc上不可用?你确定吗 ?
-
@Arabcoder:不,我不确定,如果我做错了,请纠正我。我不做MSVC。
-
关于常量的要点。一个(好的)编译器是否会抓住这一点-试图将const char强制转换为非const char?
-
@romkyns:GCC 4.5甚至不抱怨-Wall:正如Jens Gustedt指出,在nominolos答案下方,字面不是const。 (G ++抱怨,但仍然编译模块,然后退出了C语言世界。)
-
我懂了。我想如果我要学究的话,那么返回非常量字面值并不是完全错误。尽管如此,还是非常类似于C的,可以通过使文字变为非常量来使自己陷入困境。
字符串文字的类型为 const char * strike>(请参见下面的注释)static char[],但不可变。字符串文字表示指向静态分配内存的指针。因此:
返回一个这样的指针是完全可以的。
您的函数返回类型必须 strike>应该与const char*兼容,即,返回类型char * 至少会给您一个警告 strike>,以后可能会给您带来麻烦。
如果函数可能返回文字字符串或malloc字符串,则必须非常注意内存管理。 free字符串文字可能会出现段错误。
-
实际上,类型是static const char[],即更接近const char *const。您不能增加或减少文字。
-
@larsman:否,不幸的是,由于历史原因,其类型不符合const的要求。但是您没有更改它的权利:((因此声明返回值const当然是一个好主意,但是语言并不强制执行此操作。
-
@Jens:是的,它是static char[]。
-
@ larsman,@ Jens:谢谢,我纠正了。我应该在提交之前检查一下。