可能重复:
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。
答案 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];
中分配字符串。