我在C ++中遇到了关于指针的问题。代码是:
int * initArray() {
int a [2];
a[0] = 1;
a[1] = 2;
return a;
}
int main () {
int * b = initArray();
cout << b << "---" << *(b) << endl;
cout << b + 1<< "---" << *(b + 1) << endl;
}
输出
0021FC20---1
0021FC24---1431629120
您可以看到该值是错误的。
当我尝试将init
数组代码放入main函数时,它会正确运行。
你能告诉我的代码有什么问题吗?
答案 0 :(得分:8)
initArray
返回本地数组的地址,该函数在函数返回后不再存在。这是一种未定义的行为。
要使变量a
持久,即使函数返回,您也可以:
static
答案 1 :(得分:3)
实现您想要做的事情的解决方案是:
int * initArray() {
int* a = new int[2];
a[0] = 1;
a[1] = 2;
return a;
}
由于内存是手动分配的,因此它将保持不变并且构造应该有效。是的,在您的情况下,内存是自动分配的,并在函数末尾删除,导致未定义的行为。
答案 2 :(得分:1)
a是initArray方法的本地方法。方法返回后,a不再有效,因此initArray返回的指针不再有效。
您需要在main方法中分配数组,然后将指针传递给initArray方法:
void initArray(int *a) {
a[0] = 1;
a[1] = 2;
}
int main () {
int b[2];
initArray(b);
cout << b << "---" << *(b) << endl;
cout << b + 1<< "---" << *(b + 1) << endl;
}
答案 3 :(得分:0)
您的数组int a[2]
是一个本地数组,当函数存在时会被释放。