0

可能重复:
可以在其范围之外访问局部变量的内存吗?

我已经使用指针声明了一个 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 I 字符串。尽管 str 的长度不是 19。

4

3 回答 3

5

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

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

char* string = new char[20];

以后记住delete []了。

于 2012-10-06T08:30:57.880 回答
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;
}

这也意味着您无需担心最大长度(至少此时您无需担心,您可能希望在其他地方施加其他限制)并且内存分配将自动为您管理.

于 2012-10-06T08:51:22.660 回答
3

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

于 2012-10-06T08:31:51.037 回答