Повреждение массива символов C ++?

Я пытаюсь создать функцию, которая уплотняет функцию sprintf, но я как-то столкнулся со следующей проблемой:

В первой строке после вызова класса (раньше это была функция, но она тоже не работала) я получаю правильный результат: http://puu.sh/1m1Bw

Но строка после того, как я получаю что-то совершенно другое, хотя я даже не трогал класс или переменную: http://puu.sh/1m1BR

Может кто-нибудь объяснить мне, что здесь происходит?

Редактировать: Забыл реальный класс:

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

0

Решение

После StringCreator() конструктор завершает переменную-член this->str является висящим указателем, так как он указывает на buff которая является локальной переменной конструктора. Доступ к this->str после конструктора неопределенное поведение. изменения str из char* к std::string это решение, и если вам нужен доступ к const char* ты можешь использовать str.c_str(), Используя std::string также означает, что конструктор копирования по умолчанию и оператор присваивания являются правильными.

Если, как указано в комментарии к этому ответу, вы new char[255] вместо использования std::stringтогда вам нужно либо сделать StringCreator не копировать или реализовать конструктор копирования и оператор присваивания, который копирует содержимое str, Увидеть Что такое правило трех? В качестве альтернативы, вы могли бы иметь char str[255]; и избежать динамического выделения и копирования по умолчанию StringCreator было бы правильно.

Чтобы избежать возможного переполнения буфера при вызове vsprintf() использование vsnprintf() вместо этого (если ваш компилятор поддерживает C99), который принимает в качестве аргумента размер заполняемого буфера и не записывает больше указанного размера.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]