При использовании функции strncpy_s
вы указываете ей копировать столько символов, сколько уместится в ваш буфер "text"
. Поскольку строка, в которой вы создаете экземпляр "example"
, короче, функция копирования будет продолжать идти после конца фактической строки.
Вот откуда ваш мусор. Еще хуже, вы рискуете Сегментация Ошибка таким образом. Ваш код может получить доступ к частям оперативной памяти, из которой ему запрещено читать. Это приведет к взлому sh.
Вы правы, хотя скопировали данные, на которые указывает возврат c_str()
. Указатель, возвращаемый c_str()
, указывает на данные, которые принадлежат объекту std :: string и могут быть изменены или даже аннулированы этим объектом. (Подробнее здесь)
Вот модифицированная версия вашего кода, которая должна избегать мусора:
typedef class Ryadok {
private:
int LengthOf = 0;
char text[20];
string* address;
public:
Ryadok(string strin) {
this->text[0] = '\0';
memset(text, '\0', sizeof(text));
if(strin.length()+1 <= sizeof(text)) {
strncpy_s(text, strin.c_str(), strin.length()+1);
} else {
//some error handling needed since our buffer is too small
}
this->address = &strin;
for (int i = 0; i < sizeof(strin); i++) {
cout << this->text[i];
}
}
~Ryadok() {
}
}*cPtr;
int main()
{
Ryadok example("sdsdfsdf");
}