Reputation: 644
Consider the following piece of code:
void fun (string &str1, string &str2)
{
const char* cstr;
....
if(strlen(cstr = (str1+str2).c_str()) < 15)
{
// here cstr used
}
}
The condition itself works fine, but in the if-condition body cstr
contains garbage. Why?
Upvotes: 2
Views: 193
Reputation: 42934
I'm assuming the string
in your C++ code is std::string
.
str1 + str2
produces a temporary std::string
object. You invoke the c_str()
method on it, and you get a C-style string pointer to the data of this temporary std::string
object.
When the temporary std::string
goes out of scope and is destroyed, the cstr
raw C-style pointer is left dangling, pointing to invalid memory.
If you need to work on the concatenated string str1 + str2
, I would suggest you safely store it in a non-temporary std::string
object, e.g.:
std::string s = str1 + str2;
// Work with s
if (s.length() < 15) {
// Use s here
...
}
Note also that I invoked the std::string::length()
method instead of the C function strlen()
. You can use the std::string::size()
method, as well.
In general, in C++ code, you should use convenient string classes (like std::string
), instead of C-style raw string pointers.
Upvotes: 2
Reputation: 60228
In this expression:
cstr = (str1+str2).c_str()
you are taking a pointer to the temporary string str1 + str2
. This temporary dies at the end of the expression, and so you have undefined behaviour when you try to read from cstr
inside the if-body.
Upvotes: 9