【发布时间】:2018-03-09 14:55:58
【问题描述】:
我试图了解如何使用 C++ 中的函数返回数组。我想了解这里发生了什么。这是我的代码,我用 g++ -Wall return_array.cpp -o return_array 编译的
#include <iostream>
int * do_something(int number){
int viz[3] = {1,2,3};
viz[2] += number;
return &viz[0];
}
int main(){
int *viz;
viz = do_something(3);
std::cout << viz[2] << "\n";
return 0;
}
这给了我以下错误:
return_array.cpp: In function ‘int* do_something(int)’:
return_array.cpp:4:6: warning: address of local variable ‘viz’ returned [-Wreturn-local-addr]
int viz[3] = {1,2,3};
根据我的研究,该错误是由于我试图访问一个在离开函数作用域后已从堆栈中删除的指针。但是,如果我使用解决方法运行代码:
int * do_something(int number){
int viz[3] = {1,2,3};
int *pointer;
viz[2] += number;
pointer = &viz[0];
return pointer;
}
它编译并运行得很好。这个新指针不是在完全相同的情况下吗?一旦我离开该函数,它就超出了范围,应该从堆栈中删除,使用与以前相同的参数。我错过了什么?
编辑: 我的问题不是将指针返回到本地数组是否会产生错误。它应该而且确实如此。问题是为什么已经分配给指向同一个数组的指针的指针没有!
【问题讨论】:
-
编译器能为你做的只有这么多。如果您坚持解决有效错误而不是尝试解决实际错误情况,编译器可能会将其标记为错误,也可能不会。这确实是相同的情况,但由于您使用的是别名,编译器无法检查这个问题,而它可以返回数组的地址。编译器不是无所不知的。
-
谢谢,我相信这可以澄清我的疑问。我不知道编译器不会检测到这种错误。我以后会考虑到这一点。
标签: c++ pointers memory-management stack