C++ C++;字符数组损坏?
我试图构建一个压缩sprintf函数的函数,但不知怎的,我遇到了以下问题: 调用类后的第一行(它以前是一个函数,但也不起作用)我得到了正确的结果: 但是当我得到一些完全不同的东西后,我甚至没有触及类或变量: 有人能给我解释一下这里发生了什么事吗 编辑:忘记了实际的类:C++ C++;字符数组损坏?,c++,arrays,char,corruption,C++,Arrays,Char,Corruption,我试图构建一个压缩sprintf函数的函数,但不知怎的,我遇到了以下问题: 调用类后的第一行(它以前是一个函数,但也不起作用)我得到了正确的结果: 但是当我得到一些完全不同的东西后,我甚至没有触及类或变量: 有人能给我解释一下这里发生了什么事吗 编辑:忘记了实际的类: StringCreator::StringCreator(char* _parten, ...) { char buff[255]; va_list args; va_start
StringCreator::StringCreator(char* _parten, ...) {
char buff[255];
va_list args;
va_start (args, _parten);
vsprintf (buff,_parten, args);
va_end(args);
this->str = buff;
}
在.h文件中:
class StringCreator {
public:
StringCreator(char* _parten, ...);
char* str;
};
StringCreator()
构造函数完成后,成员变量this->str
是一个悬空指针,因为它指向构造函数的局部变量buff
。在构造函数之后访问this->str
是未定义的行为。将str
从char*
更改为std::string
是一种解决方案,如果需要访问const char*
可以使用str.c_str()
。使用std::string也意味着默认的复制构造函数和赋值运算符是正确的
如本答案注释所示,如果您new char[255]
而不是使用std::string
,则需要使StringCreator
不可复制,或者实现复制str
内容的复制构造函数和赋值运算符。另请参见,您可以使用charstr[255]代码>并避免动态分配,默认复制StringCreator
是正确的
要避免调用vsprintf()
时可能出现的缓冲区溢出,请改用(如果编译器支持C99)它接受正在填充的缓冲区的大小作为参数,并且写入的内容不超过指定的大小。否。除非您向我们展示代码,否则无法解释发生了什么……您的代码中有一个错误。噢,开始吧,开始吧类:StringCreator::StringCreator(char*_parten,…{char buff[255];va_list args;va_start(args,_parten);vsprintf(buff,_parten,args);va_end(args);this->str=buff;}@Thijs编辑您的问题并发布。当然!非常感谢。将其更改为:code
StringCreator::StringCreator(char*_parten,…){str=new char[255];va_list args;va_start(args,_parten);vsprintf(str,_parten,args);va_end(args);}