0

関数内のポインタを等しくするときの何が問題なのか教えてください。この例を見てみましょう:

void fun(int *array1)
{
    int array2[5];
    for(int i=0;i<5;i++)
    {
        array2[i]=3;
    }
    array1=array2;
}


int main(){
    int x[5]; int n=5;
    for(int i=0;i<5;i++){
    x[i]=i; // --------> x[i]=i;
    }

    fun(x); //--------> x[i]=3

    for(int i=0;i<5;i++){
    cout<< x[i]<<" "; //-------> x[i]=i?????????? I expected x[i]=3;
    }

    return 0;
}
4

2 に答える 2

3
void fun(int *array1)
{
    int array2[5];
    for(int i=0;i<5;i++)
    {
        array2[i]=3;
    }
    array1=array2; // **HERE**
}

この関数が戻ると、array2存在しなくなります。したがって、これがの値をarray1呼び出し元に返したとしても、呼び出し元は、存在しなくなった配列へのポインターを持っているだけです。

もちろん、それもしません。を指すように変数をarray1=array2;設定します。ただし、これらは両方ともローカル変数であるため、これはとにかく呼び出し元に影響を与えません。array1array2

おそらくあなたは望んでいた:

 memcpy(array1, array2, sizeof(array2));

ただし、これはC ++であるため、 std::arrayのような適切なコンテナを使用する必要があります。

于 2013-02-19T00:54:22.107 に答える
2

楽しい関数でint[5]を使用して新しい配列を作成します。これは、次のことを意図していると思います。

/**
  * not every array is 5 items long, thus it is unsafe
  */

void fun(int *array1)
{
    int* array2 = array1;
    for(int i=0;i<5;i++)
    {
        array2[i]=3;
    }
}

これで、int*array2はmain関数で呼び出す配列を指します

于 2013-02-19T01:00:11.437 に答える