C 返回指向文字(或常量)字符数组(字符串)的指针?
我知道这是错误的:C 返回指向文字(或常量)字符数组(字符串)的指针?,c,C,我知道这是错误的: char* getSomething() { char szLocal[5]; /* put something in the char array somehow */ return szLocal; } …因为szLocal可以在函数返回后的某个时间销毁 但是这样行吗 char* getSomethingElse() { return "something else"; } 那其实没关系。字符串文本通常分
char* getSomething() {
char szLocal[5];
/* put something in the char array somehow */
return szLocal;
}
…因为szLocal可以在函数返回后的某个时间销毁
但是这样行吗
char* getSomethingElse() {
return "something else";
}
那其实没关系。字符串文本通常分配在一个不可变的内存区域中,该内存区域在程序运行期间保持可用
另请参见的答案。在分配方面没有问题:字符串文本隐式地是静态的。返回指向文本的非
const
指针是不正确的
如果要返回可修改的(非常量
)字符串,请将其声明为静态字符[]
。或者最好返回一份副本:
return strdup("something else");
不要忘了在事后释放
strdup
是非ISO的,但几乎在任何地方都可用(我相信MSVC除外)。字符串文本的类型是const char*
(请参见下面的注释)static char[]
,但不可变。字符串文字表示指向静态分配内存的指针。因此:
返回这样的指针是非常好的
您的函数返回类型必须与const char*
兼容,即返回类型char*
至少会给您一个警告,以后可能会给您带来麻烦
如果您的函数可能同时返回一个literal或malloc
ed字符串,那么您必须非常小心内存管理free
ing字符串文字可能会出错
请参阅。在第一个示例中,szLocal不是在“某个时间之后”销毁的,而是在函数返回的那一刻销毁的,因此返回的指针已经无效。的确,它指向的数据在“一段时间”内保持不变,但函数的堆栈帧已经被释放,内存可以供任何需要创建一些局部变量或调用另一个函数的人使用。我同意romkyns的观点。但是,我们不知道你在用什么系统?可能有一些人不是那样工作的。为了你自己内心的平静,你可以试着有目的地在我们暗示这根弦不存在的记忆上跺脚。i、 e.堆栈。通过声明和分配更多的局部变量,或者使用一些参数调用一些其他函数来获取堆栈上的内容。理想情况下,使用几个参数调用另一个函数,这些参数本身声明并分配一些局部变量。10分钟内回答10个有用的问题。谢谢大家。(我在x64 windows上使用vs2010顺便说一句)字符串文字在应用程序的整个过程中都是有效的。它可能不在只读/不可变内存中,但它们保证在应用程序的生命周期内存在,因此返回指向一个的指针是可以的。实际上,类型是static const char[]
,即更接近const char*const
。您不能递增或递减文字。@larsman:不,不幸的是,由于历史原因,它的类型不是const
限定的。但是你没有权利改变它:((所以声明返回值const
当然是个好主意,但是语言没有强制执行这一点。@larsman,@Jens:谢谢,我应该在提交之前检查一下。strdup在msvc上不可用?你确定吗?@Arabcoder:不,我不确定,如果我错了,请纠正我。我不做msvc。关于co的观点很好nst.一个(好的)编译器难道不明白这一点吗?试图将常量字符转换为非常量字符?@romkyns:GCC4.5甚至没有抱怨-Wall
:正如Jens Gustedt在nominolo的回答下面指出的,文本不是常量
(G++抱怨,但仍然编译模块,然后我们就离开了C世界。)我明白了。我想如果我是学究,那么返回一个文本作为非常量并不是一个彻底的错误。不过,非常喜欢让你通过使文本为非常量来射击自己的脚。