常量字符串如何在 C++ 中工作

Posted

技术标签:

【中文标题】常量字符串如何在 C++ 中工作【英文标题】:How do constant strings work in C++ 【发布时间】:2018-04-23 12:09:08 【问题描述】:

我有这么一段代码:

class temp 

private :
    char * name;
public :
    temp(char * temp_name)

        strcpy(name,temp_name);
    cout << "Created"<<name<<endl;

    
    ~temp()
        cout<< "Destoyed"<<name<<endl;

    
;
int main() 
class temp person1("Jack");
class temp haha("Katy");
    return 0;

我希望有 2 个独立的类 temp 实例,它们的名称不同(Jack 和 Katy)。所有构造函数和析构函数都可以正常工作。 但是,我得到了这样一个奇怪的输出:

创建杰克

进程以退出代码 11 结束

我很确定问题出在构造函数 temp(char * temp_name) 中的常量字符串,但不知道是什么。

所以我的问题是你能解释一下,就内存而言,这个常量字符串是如何工作的,为什么在这种情况下我不能创建 2 个类 temp 实例?

【问题讨论】:

您的示例中没有常量字符串。这是一个常量字符串:const std::string s = "Hello World!";. 这一行:strcpy(name,temp_name); 尝试将 c 字符串复制到不存在的缓冲区。这是未定义的行为。复制前需要为name分配空间。 请同时升级您的编译器和标志。这个does not and should not compile as-is. 你在哪里倾向于语法“class temp haha​​”——因为那是非常 C 【参考方案1】:

您需要分配足够大的缓冲区以包含传递的字符串数据,并使用指向此缓冲区的指针初始化name。现在你正在取消引用未初始化的指针name 得到未定义的行为。

此外,此代码甚至无法编译,因为您试图将字符串文字传递给构造函数,并期望指向非 const 限定 char 的指针。很可能您使用的 Visual Studio 在很长一段时间内都允许这种不合规行为。从 VS2017 开始,您应该使用 /permissive- 进行编译以强制一致性。并将构造函数签名更改为

temp(char const * const temp_name)

【讨论】:

以上是关于常量字符串如何在 C++ 中工作的主要内容,如果未能解决你的问题,请参考以下文章

.push_back 如何在 C++ 中工作?

在 R 中声明一个常量变量

如何使 id3lib 在 C++ Builder 10.2 中工作?

单类型和双类型变量如何在 Matlab 中的同一代码副本中工作,就像 C++ 中的模板一样

&符号(&)符号如何在c ++中工作? [复制]

我无法让这个字符串在 C++ 中工作