我正在尝试把注意力集中在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编译器。
答案 0 :(得分:2)
values++
正在修改values
,最终形成了函数的返回值。
即您在分配的数组末尾返回一个。这本身就是完全合法的C ++。
但是在函数调用站点发生的事情非常严重:访问数组的无效元素(非正式地讲是“随机数”),并且在该元素上调用delete[]
也是未定义的行为。 轰!