让我们考虑下面的代码示例。基本上,getMessage1
(内部)创建一个std::string
,该printf
可以返回然后通过myString
打印。如何转换/广播/操作变量getMessage2
,以使输出看起来像getMessage3
中的变量?
我知道.c_str()
是可行的,但是它要求我在每个printf
语句中都包含#include <string>
const char* getMessage1() {
std::string myString = "SomeOutput";
return myString.c_str();
}
const char* getMessage2() {
return "SomeOutput";
}
std::string getMessage3() {
std::string myString = "SomeOutput";
return myString;
}
int main() {
printf("#1: %s \n", getMessage1()); // prints #1: ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠¿ⁿ9"w
printf("#2: %s \n", getMessage2()); // prints #2: SomeOutput
printf("#3: %s \n", getMessage3().c_str()); // prints #3: SomeOutput
return 0;
}
(并且我想避免使用这个额外的后缀)。
if (role == Qt::BackgroundRole && isCategory(index)) {
QBrush lightGrayColor(Qt::lightGray);
return lightGrayColor;
}
答案 0 :(得分:4)
getMessage1的问题在于,您将指针返回到局部变量,一旦离开该函数,该指针就会悬空,指针将被删除。
最简单的解决方案是,如果可能的话,将myString设为静态,以便其寿命与程序本身一样长。
const char* getMessage1() {
static std::string myString = "SomeOutput";
return myString.c_str();
}
int main() {
printf("#1: %s \n", getMessage1()); // prints #1: SomeOutput
return 0;
}
Link to working example on ideone
有关更多示例,请参见how to return pointer of local variable。