[英]The array reassignment in the following c++ function seems to have been ignored after the function call.
void func(int* array)
{
array=new int[5];
for (int i=5; i>0; i--)
array[5-i]=i;
}
int main()
{
int array[5]= {1,2,3,4,5};
func(array);
cout<<array[1]<<endl;
}
我认为这与数组是常量指针有关。 c ++如何处理此代码以及在函数中分配的动态内存会发生什么?
当通过值传递数组作为参数传递给函数,它衰减到指针的第一个元素,然后把它由值来传递。 所以你在函数func
收到的是数组第一个元素地址的副本 。 在函数中,您只需更改地址,这不会更改main()
函数中的数组。 无论你对func()
array
做什么,只对该函数是本地的 。 它是这样的:
void f(int x)
{
x= 100; //modifying the copy, not the variable in main()
}
int main()
{
int value = 1000;
f(x); //pass by value, means pass a copy!
}
在这种情况下,您将在f()
更改x
的值。 同样,在您的情况下,您正在更改array
的值。 由于array
是指针,因此通过为其分配新内存使其指向不同的位置。 每个变化都是函数的本地变化。
另请注意,由于您将内存分配给变量array
,并且不释放它,因此程序会泄漏内存 。 为了避免这种情况,你必须写:
delete [] array;
在从函数返回之前。 同样,这个delete
不会改变main()
array
。
顺便说一句,如果你想在main()
更改数组的元素,那么你应该这样做:
void func(int* array)
{
//array=new int[5]; //just comment this
for (int i=5; i>0; i--)
array[5-i]=i; //now array points to the same memory
//where main()'s array is in the memory.
}
希望有所帮助。
这是问题所在:
array=new int[5];
此赋值意味着不会修改传递的参数。 在这个赋值之后, array
指向一个新分配的内存块,而不是指向main
声明的array
(并作为参数传递给func
)。 修改的是这个新分配的数组 - 当函数返回时抛出它。 更糟糕的是,你有内存泄漏。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.