将本地char数组与原始字符串文字存储为类成员



假设我有这样一个简单的代码:

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

该数组具有自动存储功能,因此当函数返回时指针失效。

最新更新