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

配列を引数として関数に値で渡すと、最初の要素へのポインターに減衰し、最初の要素が値で渡されます。したがって、関数で受け取るのfuncは、配列の最初の要素のアドレスのコピーです。関数では、アドレスを変更するだけで、関数の配列は変更されませんmain()。で何をするにしてもarrayfunc()その関数に対してのみローカルです。これは次のようなものです。

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はで変更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.
}

お役に立てば幸いです。

于 2013-03-02T02:52:50.710 に答える
0

ここに問題があります:

array=new int[5];

この割り当ては、渡されたパラメーターが変更されないことを意味します。この割り当ての後、で宣言された(そして引数として渡された)arrayのではなく、新しく割り当てられたメモリのチャンクを指します。変更されるのは、この新しく割り当てられた配列です。これは、関数が戻るときに破棄されます。さらに悪いことに、メモリリークが発生しています。arraymainfunc

于 2013-03-02T02:45:48.510 に答える