对char数组感到困惑

时间:2014-03-11 16:31:01

标签: c++ arrays string char

我正在尝试实现下面的功能,但打印出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;
}

3 个答案:

答案 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是从本地数组构造的并且返回而不是局部变量。

相关问题