我正在努力思考 C++ 中的数组和指针。
我正在尝试编写一个函数,为可变大小的 int
数组分配内存。然后用随机数填充数组并返回。
我遇到的问题是用指针赋值。
这是函数:
int* getArray(int length) {
int* values = new int[length];
for (int i=0; i<length; i++) {
values[i]=i;
}
return values;
}
而且效果很好。
但是,如果我把它改成这样:
int* getArray(int length) {
int* values = new int[length];
for (int i=0; i<length; i++, values ++) {
*values=i;
}
return values;
}
它不起作用。
有人可以向我解释为什么我不能这样做吗?
这是我用来打印所有值的 main
方法:
int main() {
int* v = getArray(100);
for(int i=0;i<100;i++, v++) {
cout << *v <<endl;
}
delete[] v;
return 0;
}
我认为这是因为 new
运算符在堆中而不是堆栈中分配新内存,所以指针实际上可能指向错误的方向。
但是,如果这是真的,为什么 main
方法有效?
旁注:我没有收到任何类型的警告或错误,但输出只是一串零和一些随机数。
我在 Ubuntu 上使用 GCC 编译器。
最佳答案
values++
就是修改values
,最终形成函数返回值。
即您返回分配数组末尾的一个。这本身就是完全合法的 C++。
但是在函数调用处出现了非常严重的错误:您访问了数组的无效元素(非正式地说是您的“随机数”),然后调用 delete[]
也是未定义的行为。 轰!
关于C++ 返回数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51824570/