C++中的对象分配

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

在这段代码中,指针 temp 所指向的对象是在哪里分配的?它的作用域是什么?

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

3个回答

13

代码正确吗?

是的,你的代码几乎没有问题,因为"string"是一个字符串字面量,位于静态存储区。

注意:指针只是一个存储内存地址的变量。这行代码仅将字符串字面量"string"的地址存储在名为temp的变量中。

char *temp = "string";
C++标准保证字符串字面量将在程序的整个生命周期中一直存在于内存中,具体如下所述。这意味着您可以在整个程序生命周期中的任何作用域中自由使用该内存地址。请注意,如果尝试修改字符串字面量,则会导致未定义的行为,并且函数返回值应该声明为const char*。另外,如果在代码中有两个名为"string"的字符串,则它们是否不同是实现定义的。

6
这段代码能够正常运行(且正确)的原因是对象“string”是静态数据,它在编译期间被“分配”(可以这么说),链接器会将其放置在可执行文件的一个特殊部分中。但符合标准的 C++ 应该在引用静态数据时使用 const char* 而不是 char*

这不是标准的要求。Poiuyt的代码完全合法。使用char const而不是char是更好的/惯例/,但标准并不要求。 - Edward Strange
2
@Noah:如果你修改这个字符串字面量,那么它是未定义的行为。 - Brian R. Bondy
@EFraim,@Brian R. Bondy,@Noah Roberts:为什么“string”不是局部变量,属于“myfunc()”? - Moeb
@Poiuyt:根据字符串字面值的定义,我引用了C++规范中确切的部分来说明。 - Brian R. Bondy
2
@Noah:标准明确不赞成将字符串字面量绑定到'char *'。请参见[conv.array§2]。将g ++设置为高警告级别,并阅读编译器输出,其中确切说明了这一点。 - fredoverflow
1
@Fred,正是如此。完整引用:附录 D.4。我改口了。 - Edward Strange

3

如前所述,它在编译时分配;它是一个字面量。

但在C++中,它并不像可能的那样有效,因为指针没有指向 const char。一般来说,你应该考虑以非常不同的方式完成它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接