C++中的对象分配

Moe*_*oeb 5 c++ string pointers scope

char *myfunc() {
    char *temp = "string";
    return temp;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Bri*_*ndy 13

代码是否正确?

是的,您的代码(几乎)很好,因为它"string"是一个字符串文字,位于静态存储中.

注意:指针只是一个存储内存地址的变量.该行只是将字符串文字"string"的地址存储在一个名为的变量中temp.

char *temp = "string";
Run Code Online (Sandbox Code Playgroud)

C++标准保证字符串文字将在程序的持续时间内保留在内存中,如下所述.这意味着您可以在程序的整个生命周期中随意在任何范围内使用该内存地址.


为什么?

C++ 03标准(当前)有这样的说法:

普通的字符串文字具有类型"n const char数组"和静态存储持续时间(3.7),

第3.7.1节 - 1节:

既没有动态存储持续时间也没有本地的所有对象都有静态存储持续时间.这些对象的存储应持续该程序的持续时间.


警告:

在您的代码中,您将返回a char*,您应该真的返回一个const char *.如果您尝试修改字符串文字,则它是未定义的行为,并且您的函数返回值不应假装允许它.

在警告的相关方面注意.如果您在2个不同位置的代码中有一个字符串,"string"那么它是否是不同的字符串就是实现定义的.


EFr*_*aim 6

这段代码工作(并且是正确的)因为对象"string"是静态数据,在编译期间被"分配"(也就是说) - 链接器将它放在可执行文件的特殊部分中.

但是,符合标准的C++应该说const char*而不是char*在引用静态数据时.

  • @Noah:如果你修改了这个字符串文字,那么它是未定义的行为. (2认同)
  • @Noah:标准明确地将绑定字符串文字弃用为`char*`.见[conv.array§2].将g ++设置为高警告级别并读取编译器输出,该输出正好说明了这一点. (2认同)