我是c ++的新手,我已经阅读了很多有关此问题的堆栈溢出帖子。请告诉我我不理解的东西,看起来很基本......为什么呢?
int* getArray() {
int a[] = { 3, 4, 3, 1, 5 };
return a;
}
void main() {
int *result = getArray();
for(int i = 0; i < 5; i++) {
std::cout << result[i] << std::endl;
}
}
返回:
3
263996040
-1
4651964
263540469
答案 0 :(得分:1)
您可以通过添加static
关键字“保持”“
int* getArray() {
static int a[] = { 3, 4, 3, 1, 5 };
return a;
}
void main() {
int *result = getArray();
for(int i = 0; i < 5; i++) {
std::cout << result[i] << std::endl;
}
}
函数返回后, static
使数组保留在内存中 - 通常是因为你想在函数中再次使用它。做上述事情被认为是“丑陋”,但它有效......
你所看到的是这样一个事实,即从getArray()
返回后释放的内存很乐意被重新用于其他目的。事实上,没有告诉那里最终会发生什么(可能是cout
函数的一些临时存储),当你将它解释为int
时(因为你正在使用{{访问这些内存位置) 1}}指针),你只会看到int *a
表示任何字节恰好在那里。
更新“不那么丑陋的方式”来做到这一点:
int
答案 1 :(得分:1)
a
是一个临时变量,在函数getArray完成执行后将被解构。所以“结果”指向一些无效的记忆。
答案 2 :(得分:1)
不要使用“local”变量(堆栈分配的内存)并将其返回。而是使用动态(堆分配的内存)变量并将其返回并要求调用者在使用后销毁它。
喜欢这个......
void getArray(int** a, int &size)
{
size = 5;
// Allocate memory on heap so it remain accessible until destroyed explicitly.
int *arr = new int[size];
for (int i = 0; i<size; ++i)
{
arr[i] = i;
}
*a = arr;
return;
}
int main() {
int *a = NULL;
int arrSize = 0;
getArray(&a, arrSize);
for(int i = 0; i < arrSize; i++) {
std::cout << a[i] << std::endl;
}
// Release/Destroy the memory. DON'T FORGET TO CALL THIS ONCE YOU ARE DONE with 'a' !!
delete a;
}