Строка C ++ в C строку - PullRequest
1 голос
/ 07 мая 2020

Рассмотрим следующий фрагмент кода:

void fun (string &str1, string &str2)
{
   const char* cstr;
....
   if(strlen(cstr = (str1+str2).c_str()) < 15)
   {
      // here cstr used
   }
}

Само условие работает нормально, но в теле условия if cstr содержится мусор. Почему?

Ответы [ 2 ]

9 голосов
/ 07 мая 2020

В этом выражении:

cstr = (str1+str2).c_str()

вы берете указатель на временную строку str1 + str2. Это временно умирает в конце выражения, поэтому при попытке чтения из cstr внутри if-body возникает неопределенное поведение.

2 голосов
/ 07 мая 2020

Я предполагаю, что string в вашем коде C ++ - std::string.

str1 + str2 создает временный объект std::string. Вы вызываете на нем метод c_str() и получаете строковый указатель в стиле C на данные этого временного std::string объекта.

Когда временный std::string выходит за пределы области видимости и уничтожается, указатель стиля cstr raw C остается висящим, указывая на недопустимую память.

Если вам нужно работать с объединенной строкой str1 + str2, я бы предложил вы безопасно храните его в объекте non -Contemporary std::string, например:

std::string s = str1 + str2;
// Work with s
if (s.length() < 15) {
    // Use s here
    ...
}

Обратите внимание, что я вызвал метод std::string::length() вместо C function strlen(). Вы также можете использовать метод std::string::size().

Как правило, в коде C ++ следует использовать удобную строку classes (например, std::string) вместо C - стиль указателей на необработанные строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...