我试图从函数返回字符串数组并循环遍历它:
string* fetchArray()
{
string myArray[10] = { "0" };
myArray[9] = { "End" };
return myArray;
};
int main()
{
string* fetchedArray = fetchArray();
while (*fetchedArray != "End")
{
cout << *fetchedArray << endl;
fetchedArray++;
}
return 0;
}
但是,我做错了什么。这会导致运行时错误。我可以在调试时看到* fetchedArray在函数调用后为空,这可能意味着函数没有返回我期望的内容。我至少期待数组的第一个元素是正确的。
错误:
Test.exe中的0x54AA40D5(vcruntime140d.dll)抛出异常: 0xC0000005:访问冲突读取位置0xCCCCCCCC。
通常,我会在这种情况下使用vector,但我想测试这种行为。
答案 0 :(得分:3)
返回指向本地变量的指针。变量ex.ExamResults
与所有其他局部变量一样,一旦返回定义的函数,它就会超出范围。这将为您留下一个指向不再存在的数据的迷路指针,并导致未定义的行为。
作为一个有趣的旁注:只有拥有杂散指针本身不是UB,但是尝试取消引用指针是导致UB的原因。所以你可以返回一个指向局部变量的指针,只要你不使用它(这是毫无意义的)。
答案 1 :(得分:2)
您正在返回本地变量的地址,该地址变量在从调用返回import inspect
# no sys.path manipulation
dev1 = __import__('envs.dev1.dev1', fromlist=['dev1'])
print inspect.getmembers(dev1, inspect.isclass)
后超出范围。
答案 2 :(得分:2)
您正在返回指向局部变量的指针。局部变量在它们声明的函数结束时被销毁。因此你最终会得到一个悬空指针。取消引用会导致未定义的行为。