Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to set char * value from std string (c_str()) not working

i dont know but this not working for me im getting garbege value when i try to set char * value from function that returns std string :

string foo()
{
  string tmp ="dummy value";
  return tmp;
}

char* cc = (char *) foo().c_str(); // if i remove the casting im getting error 
// when i print the cc i get garbage 
printf("%s",cc);
like image 376
user63898 Avatar asked May 10 '11 08:05

user63898


2 Answers

The lifetime of the data pointed to by cc is the same as the lifetime of the string it came from (at best - if you modify the string it's even shorter).

In your case, the return value of foo() is a temporary that is destroyed at the end of the initialization of cc.

To avoid the compilation error in char *cc = foo().c_str() you shouldn't cast to char*, you should switch to const char *cc, since const char* is what c_str() returns. That still doesn't solve the main problem, though.

The simplest fixes are:

printf("%s", foo().c_str()); // if you don't need the value again later

const string s = foo();
const char *cc = s.c_str();  // if you really want the pointer - since it's
                             // in the same scope as s, and s is const,
                             // the data lives as long as cc's in scope.

string s = foo();
printf("%s", s.c_str());     // if you don't store the pointer,
                             // you don't have to worry about it.

std::cout << foo(); // printf isn't bringing much to this party anyway.
like image 59
Steve Jessop Avatar answered Oct 06 '22 00:10

Steve Jessop


The result of foo is a temporary object that gets destroyed by the end of char * cc = ... line. Store it in constant reference:

const string& cc = foo();
printf ("%s", cc.c_str());
like image 42
Xion Avatar answered Oct 05 '22 23:10

Xion