C++ C+中的对象分配+;

C++ C+中的对象分配+;,c++,string,pointers,scope,C++,String,Pointers,Scope,在这段代码中,temp指向的对象的分配发生在哪里?它的范围是什么 这个函数是返回char*指针的有效方法吗?这段代码是有效的(并且是正确的),因为对象“string”是静态数据,在编译过程中是“分配的”(也就是说),链接器将其放在可执行文件的一个特殊部分 P>但标准化C++在引用静态数据时,应该说 const char */c>而不是 char */c>。< > > P> 代码是否正确?< /强> < /P> 是的,您的代码(几乎)很好,因为“string”是一个字符串文本,位于静态存储器中

在这段代码中,
temp
指向的对象的分配发生在哪里?它的范围是什么

这个函数是返回char*指针的有效方法吗?

这段代码是有效的(并且是正确的),因为对象“string”是静态数据,在编译过程中是“分配的”(也就是说),链接器将其放在可执行文件的一个特殊部分


<> P>但标准化C++在引用静态数据时,应该说<代码> const char */c>而不是<代码> char */c>。< > > P> <强>代码是否正确?< /强> < /P> 是的,您的代码(几乎)很好,因为
“string”
是一个字符串文本,位于静态存储器中

注意:指针只是一个存储内存地址的变量。此行仅将字符串文本“string”的地址存储在名为
temp
的变量中

char *myfunc() {
    char *temp = "string";
    return temp;
}

C++标准保证字符串文字将在下面定义的程序的持续时间内留在内存中。这意味着在程序的整个生命周期中,您可以在任何地方的任何范围内自由使用该内存地址


为什么?

C++03标准(当前)有这样一句话:

普通字符串文字具有类型 “n常量字符数组”与静态 储存期限(3.7)

以及第3.7.1-1节:

既不具有动态特性也不具有动态特性的所有对象 存储持续时间也不是本地的 静态存储持续时间。仓库 因为这些目标将持续一年 课程的持续时间


警告:

在您的代码中,您正在返回一个
char*
,实际上您应该返回一个
const char*
。如果您试图修改字符串文字,则这是未定义的行为,并且您的函数返回值不应假装允许它


在警告的相关侧注上。如果在代码中的两个不同位置有一个名为
“string”
的字符串,那么它们是否是不同的字符串将由实现定义

如前所述,它是在编译时分配的;这是字面意思


<>但是在C++中,它没有那么有效,因为指针没有指向<代码> const char < />代码。总的来说,这是你应该考虑的一个非常不同的方式。 这不是标准的要求。波伊特的密码是完全合法的。使用char const*而不是char*是一种更好的/实践/方法,但标准不要求它。@Noah:如果修改此字符串文字,这是未定义的行为。@EFraim,@Brian R.Bondy,@Noah Roberts:?@Noah:标准明确反对将字符串文本绑定到
char*
。请参见[conv.array§2]。将g++设置为高警告级别,并读取编译器输出,该输出准确地说明了这一点。@Fred,确实如此。完整引文:附件D.4。我被纠正了。
char *temp = "string";