我正在尝试实现下面的功能,但打印出Printme()的输出,该程序冻结。有什么想法吗?
int main()
{
for (int i=0; i<12; i++)
{
cout<< PrintMe()[i];
}
return 0;
}
char * PrintMe() {
char str[12];
strncpy (str, "hello world", 11);
str[11] = 0;
return str;
}
答案 0 :(得分:4)
当您返回指向临时的指针时,您的代码会调用未定义的行为。
一旦PrintMe
结束执行,str
就会被销毁。因此,您使用PrintMe()[i]
访问的指针无效。
要修复此问题,您必须返回堆分配的字符串(无自动存储持续时间)。但不要忘记事后毁掉它:
char * PrintMe() {
char* str = new char[12];
strncpy (str, "hello world", 11);
str[11] = 0;
return str;
}
char* str = PrintMe();
for (int i=0; i<12; i++)
{
cout<< str[i];
}
delete[] str;
或者当你正在编写c ++时,为什么不选择std::string
?
答案 1 :(得分:0)
程序具有未定义的行为,因为函数PrintMe
返回指向退出函数后将被销毁的本地数组的第一个元素的指针。所以指针无效。
以下列方式更改功能以获得预测结果
char * PrintMe() {
static char str[12];
strncpy (str, "hello world", 11);
str[11] = 0;
return str;
}
答案 2 :(得分:0)
在PrintMe函数中,您将返回指向局部变量的指针。这是未定义的行为:
char* PrintMe() {
char str[12];
//...
return str; // cannot do this, UB.
}
如果将返回类型更改为std :: string
,则此方法有效std::string PrintMe() {
char str[12];
//...
return str;
}
上面现在可以工作的原因是std :: string是从本地数组构造的并且返回而不是局部变量。