char *myfunc() {
char *temp = "string";
return temp;
}
在这段代码中,temp
指向的对象的分配在哪里发生?它的范围是什么?
此函数是否是返回char *指针的有效方法?
答案 0 :(得分:13)
代码是否正确?
是的,您的代码(几乎)很好,因为"string"
是一个字符串文字,位于静态存储中。
注意:指针只是一个存储内存地址的变量。该行只是将字符串文字“string”的地址存储在名为temp
的变量中。
char *temp = "string";
C ++标准保证字符串文字将在程序的持续时间内保留在内存中,如下所述。这意味着您可以在程序的整个生命周期内随时随地在任何范围内使用该内存地址。
<强>为什么吗
C ++ 03标准(当前)有这样的说法:
普通的字符串文字有类型 “n const char数组”和静态 存储时间(3.7),
第3.7.1节 - 1:
所有既没有动态的物体 储存时间也不是当地的 静态存储时间。存储 因为这些物体应该持久 该计划的持续时间。
警告:强>
在您的代码中,您返回char*
,您应该真正返回const char *
。如果您尝试修改字符串文字,则它是未定义的行为,并且您的函数返回值不应假装允许它。
警告的相关附注。如果您在2个不同位置的代码中有一个名为"string"
的字符串,那么它们是否是不同的字符串是实现定义的。
答案 1 :(得分:6)
这段代码工作(并且是正确的)因为对象“string”是静态数据,在编译期间被“分配”(也就是说) - 链接器将它放在可执行文件的特殊部分。
但是,在引用静态数据时,符合标准的C ++应该说const char*
而不是char*
。
答案 2 :(得分:3)
如前所述,它是在编译时分配的;这是一个文字。
但是在c ++中它不尽可能有效,因为指针不指向const char
。一般来说,这是你应该考虑以一种非常不同的方式做的事情。