printf question with a const char* variable

c++, const-char, printf

Solution

Something in the chain of `font.family().family().string().utf8().data()` is returning a temporary object. In your first `printf`, the temporary object doesn't go out of scope until the `printf` returns. In the second `printf`, the temporary has been destroyed after the pointer assignment was made, and the pointer is now invalid. You're seeing a classic example of "undefined behavior".

There are two ways to fix this. Either make a copy of the data before the temporary gets destroyed, or make a reference to the temporary. The copy is probably easiest and clearest, as long as the class has a copy operator. Assuming that `utf8()` generates a temporary `CString`, this would be

CString fontFamily = font.family().family().string().utf8();
printf ("drawText2 %s \n", fontFamily.data());

Problem

I am stuck in a printf problem. I would appreciate if I can get some help here: In the below code, I can see the font family get displaced correctly in first printf(), but if I set it to variable, i only get an empty string. How can I put it in a variable and have the right values? I just don't want to type 'font.family().family().string().utf8().data()' everywhere? I did this in the same method: ``` void myMethod() { const char* fontFamily = font.family().family().string().utf8().data(); // get displayed correctly printf ("drawText1 %s \n", font.family().family().string().utf8().data()); // get an empty string printf ("drawText2 %s \n", fontFamily); } ``` And the signature of 'data()' is ``` class CString { public: CString() { } CString(const char*); CString(const char*, unsigned length); CString(CStringBuffer* buffer) : m_buffer(buffer) { } static CString newUninitialized(size_t length, char*& characterBuffer); const char* data() const; //... } ``` The signature of utf8() is ``` class String { CString utf8() const; } ``` Thank you.

Original source