常量字符串如何在 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++ 中工作的主要内容,如果未能解决你的问题,请参考以下文章
如何使 id3lib 在 C++ Builder 10.2 中工作?