使用const指针的C样式字符返回不正确的结果

时间:2012-10-06 08:28:39

标签: c++

  

可能重复:
  Can a local variable’s memory be accessed outside its scope?

我已经使用指针声明了一个C样式数组,并为它赋值函数返回的值。

1。const char* str = chArr->readString();

在上面之后,我想以如下方式讨论str:

2。cout << "pointer to char is = " << str <<endl;

readString是:

char* CharArray::readString()
{
    std::cout << "Insert a string of max 19 length:" <<std::endl;
    char string[20];
    std::cin.getline(string,20,'\n');
    return string;
}

当我在第2行放置断点时,我可以看到正确的结果为str的值。 但是控制台窗口什么都没有显示,在通过第2步后,当我查看str值时,它显示的内容类似于“P÷7”或“äû:”,..

也许值得一提的是,对于长度为4,5的str我字符串。尽管长度为str,但不是19。

3 个答案:

答案 0 :(得分:5)

您正在返回指向局部变量的指针。在函数结束后,系统将再次使用此变量的内存地址。所以有些其他代码可能会用一些随机数据覆盖它,这就是你看到乱码的原因。

为了安全地执行此操作,请使用:

char* string = new char[20];

记得事后delete []

答案 1 :(得分:4)

您正在返回本地变量的地址,退出该函数后,其他内存将被其他内容重用。你最好还是返回一个std :: string,而不是这样:

std::string CharArray::readString()
{
    std::cout << "Type a string and hit enter:" << std::endl;
    std::string str;
    std::getline(std::cin, str);
    return str;
}

这也意味着您不必担心最大长度(至少您不必担心此时,您可能还有其他限制要在其他地方施加)并且将管理内存分配为你自动。

答案 2 :(得分:3)

您可以在readString范围内创建字符串。当你返回时,你的字符串将被销毁。如果要避免此行为,则必须在函数char *string = new char[20];中分配字符串。