我有一个正在处理的字符串类的追加函数部分,并且在使用时发生了一些非常奇怪的事情。当我在函数内打印附加的字符串,然后在main
中打印出来时,它可以正常工作。但是当我在函数内部注释掉打印部分并将打印件保留在main
中时,输出是一些随机字符。这是代码:
String.cpp:
void String::append(const String buf)
{
char c[99];
for (auto i = 0; i < this->length(); ++i) {
c[i] = this->cstr()[i];
}
for (auto i = this->length(); i < (this->length() + buf.length() + 1); ++i) {
c[i] = buf.cstr()[i - this->length()];
}
*this = c;
printf("%s\n", *this); // if I comment this line out then the append function doesn't work properly
}
主:
int main()
{
String a = "Hello";
String b = "Hi";
a.append(b);
printf("%s\n", a);
}
当使用两种打印功能时,输出为:
仅使用main中的打印功能时:
可能导致这种情况的原因是什么?感谢。
编辑:
作业运营商:
String &String::operator=(char* buf) {
_buffer = buf;
return *this;
}
构造
String::String(char* buf) : _buffer(buf), _length(0) {
setLength();
}
答案 0 :(得分:2)
char c[99];
是具有自动存储持续时间的数组。离开c
函数后,使用指向第一个元素(又名append()
)的指针是未定义的行为。
通过赋值运算符存储它不会保存数据或防止数据被删除。
为了保持数据,您需要使用new和delete处理动态分配(这将是一些努力,考虑构造函数,析构函数,赋值,复制构造函数/赋值)或者您需要将数据复制到您先前分配的缓冲区。
有关复制字符数组的方法,请参阅this question