0
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++ 究竟如何处理此代码以及函数内分配的动态内存会发生什么情况?

4

2 回答 2

2

当您通过value将数组作为参数传递给函数时,它会衰减到指向第一个元素的指针,然后通过value传递。因此,您在函数func中收到的是数组第一个元素地址的副本。在函数中,您只需更改地址,这不会更改main()函数中的数组。无论您对arrayin执行什么操作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!
}

在这种情况下,您正在更改xin的值f()。同样,在您的情况下,您正在更改array. 由于array是一个指针,因此您通过为其分配新内存来使其指向不同的位置。 每个更改都是函数的本地更改。

另请注意,由于您将内存分配给变量array,并且不释放它,因此您的程序会泄漏内存。为了避免这种情况,您必须编写:

 delete [] array;

在从函数返回之前。同样,这delete不会arraymain().

顺便说一句,如果你想改变数组中的元素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.
}

希望有帮助。

于 2013-03-02T02:52:50.710 回答
0

这是问题所在:

array=new int[5];

这个赋值意味着传递的参数不会被修改。在此分配之后,array指向新分配的内存块,而不是array声明的 in (并作为参数main传递给)。func修改的是这个新分配的数组——当函数返回时,它被丢弃了。更糟糕的是,您有内存泄漏。

于 2013-03-02T02:45:48.510 回答