Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;字符数组损坏?_C++_Arrays_Char_Corruption - Fatal编程技术网

C++ C++;字符数组损坏?

C++ C++;字符数组损坏?,c++,arrays,char,corruption,C++,Arrays,Char,Corruption,我试图构建一个压缩sprintf函数的函数,但不知怎的,我遇到了以下问题: 调用类后的第一行(它以前是一个函数,但也不起作用)我得到了正确的结果: 但是当我得到一些完全不同的东西后,我甚至没有触及类或变量: 有人能给我解释一下这里发生了什么事吗 编辑:忘记了实际的类: StringCreator::StringCreator(char* _parten, ...) { char buff[255]; va_list args; va_start

我试图构建一个压缩sprintf函数的函数,但不知怎的,我遇到了以下问题:

调用类后的第一行(它以前是一个函数,但也不起作用)我得到了正确的结果:

但是当我得到一些完全不同的东西后,我甚至没有触及类或变量:

有人能给我解释一下这里发生了什么事吗

编辑:忘记了实际的类:

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);}