我是C ++的新手。我习惯用Java编程。这个特殊的问题给我带来了很大的问题,因为C ++在处理数组时并不像Java那样。在C ++中,数组只是指针。
但为什么这段代码:
#include <iostream>
#define SIZE 3
using namespace std;
void printArray(int*, int);
int * getArray();
int ctr = 0;
int main() {
int * array = getArray();
cout << endl << "Verifying 2" << endl;
for (ctr = 0; ctr < SIZE; ctr++)
cout << array[ctr] << endl;
printArray(array, SIZE);
return 0;
}
int * getArray() {
int a[] = {1, 2, 3};
cout << endl << "Verifying 1" << endl;
for (ctr = 0; ctr < SIZE; ctr++)
cout << a[ctr] << endl;
return a;
}
void printArray(int array[], int sizer) {
cout << endl << "Verifying 3" << endl;
int ctr = 0;
for (ctr = 0; ctr < sizer; ctr++) {
cout << array[ctr] << endl;
}
}
打印出验证2的任意值并验证3.也许这与数组实际作为指针处理的方式有关。
答案 0 :(得分:9)
问题是您无法返回本地数组:
int a[] = {1, 2, 3};
...
return a;
无效。在返回之前,您需要将a
复制到动态内存中。目前,由于a
已在自动存储中分配,因此只要函数返回,就会回收数组的内存,从而使返回的值无效。 Java没有相同的问题,因为所有对象(包括数组)都在动态存储中分配。
更好的是,您应该避免使用数组来支持旨在替换它们的C ++类。在这种情况下,使用std::vector<int>
将是更好的选择。
答案 1 :(得分:6)
因为您的数组是堆栈分配的。从Java迁移到C ++,您必须非常小心对象的生命周期。在Java中,所有内容都是堆分配的,并且在没有对其进行引用时进行垃圾回收。
然而,在这里,您定义了一个堆栈分配的数组a,当您退出函数getArray时会将其销毁。这是(许多)原因之一,向量优先于普通数组 - 它们为您处理分配和释放。
#include <vector>
std::vector<int> getArray()
{
std::vector<int> a = {1, 2, 3};
return a;
}
答案 2 :(得分:1)
内存中有两个变量可以去的地方:堆栈和堆。堆栈包含在方法中创建的局部变量。堆在其他条件下保存其他变量,如静态变量。
在a
中创建GetArray()
时,它是存储在堆栈中的局部变量,a
是指向该位置的指针。当方法返回指针时,释放了该堆栈的层(包括指针指向的实际值)。
相反,您需要动态分配数组,然后值将在堆中,当函数返回时未清除,并且a
将指向它们。
int * GetArray() {
int* a = new int[3];
a[0] = 1;
a[1] = 2;
a[2] = 3;
cout << endl << "Verifying 1" << endl;
for (int ctr = 0; ctr < 3; ctr++)
cout << a[ctr] << endl;
return a;
}
现在你要在函数中传递这些int的地址,而这些值都位于堆中,直到程序结束才会释放它们,或者(最好)你delete
它们。