假设我有这样一个简单的代码:
class Foo
{
private:
const char* str;
public:
void Set(const char* c) { str = c; }
const char* Get() const { return str; }
};
Foo f;
void func1()
{
// Please note: Comments of the answer below refer to const char* localStr.
// I posted the wrong code.
const char localStr[] = "Hello world!";
//f.Set(localStr); // Of course, does not work, std::cout prints garbage
f.Set("Hello world!"); // Works
}
int main()
{
func1();
std::cout << "Get: " << f.Get() << std::endl;
}
我想知道为什么f.Set("Hello world!");
是工作的。
对于我的理解,f.Set(localStr);
当然不工作。当func1()
返回时,localStr
超出作用域,Foo::str
指向垃圾
但是f.Set("Hello world!");
发生了什么?我认为字符串参数也是一个临时/本地const char[]
,它作为指针传递给Foo::Set
(指向它的第一个元素)。为什么Foo::str
在调用后仍然有效,当传递的参数只是一个临时/本地?
但是f.Set("Hello world!");发生了什么?
字符串字面值具有静态存储时间。
将char数组存储为类成员
需要说明的是,类的成员不是数组。它是一个指针。
const char* localStr = "Hello world!"; //f.Set(localStr); // Of course, does not work, std::cout prints garbage
这(当然)也可以工作,std::cout不会打印垃圾。
const char localStr[] = "Hello world!"; //f.Set(localStr); // Of course, does not work, std::cout prints garbage
该数组具有自动存储功能,因此当函数返回时指针失效。