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++ 究竟如何处理此代码以及函数内分配的动态内存会发生什么情况?
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++ 究竟如何处理此代码以及函数内分配的动态内存会发生什么情况?
当您通过value将数组作为参数传递给函数时,它会衰减到指向第一个元素的指针,然后通过value传递。因此,您在函数func
中收到的是数组第一个元素地址的副本。在函数中,您只需更改地址,这不会更改main()
函数中的数组。无论您对array
in执行什么操作func()
,都只针对该功能。它是这样的:
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!
}
在这种情况下,您正在更改x
in的值f()
。同样,在您的情况下,您正在更改array
. 由于array
是一个指针,因此您通过为其分配新内存来使其指向不同的位置。 每个更改都是函数的本地更改。
另请注意,由于您将内存分配给变量array
,并且不释放它,因此您的程序会泄漏内存。为了避免这种情况,您必须编写:
delete [] array;
在从函数返回之前。同样,这delete
不会array
在main()
.
顺便说一句,如果你想改变数组中的元素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
指向新分配的内存块,而不是array
声明的 in (并作为参数main
传递给)。func
修改的是这个新分配的数组——当函数返回时,它被丢弃了。更糟糕的是,您有内存泄漏。