0
#define NUM_EL 10

int randomArray1[NUM_EL];
int randomArray2[NUM_EL];
int sumArray[NUM_EL];

//Function Protocol
int IntializeArrayWithPointers(int, int, int);
void DisplayArrayDataWithPointers(int);
int AddTwoArraysWithPointers(int,int,int);

int main()
{   
    *randomArray1=IntializeArrayWithPointers(randomArray1, 0, 1);
    *randomArray2=IntializeArrayWithPointers(randomArray2, 10, 11);
    *sumArray=AddTwoArraysWithPointers(randomArray1,randomArray2,sumArray);
    DisplayArrayDataWithPointers(randomArray1);
    DisplayArrayDataWithPointers(randomArray2);
    DisplayArrayDataWithPointers(sumArray);
}


int IntializeArrayWithPointers(int pointer1[], int a, int b)
{
    int i;
    int* pa;
    pa= pointer1;

    for(i = 0; i < NUM_EL; i++)
    {
        pa[i] = rand()%(b-a+1)+a;
    }
}

void DisplayArrayDataWithPointers(int* p)
{
    int i;
    for(i = 0; i < NUM_EL; i++)
    {
        printf("arrayEL[%d] = %d at %p \n",i,p[i],&p[i]);
    }
    printf("\n");
}

int AddTwoArraysWithPointers(int a[],int b[],int c[])
{
    int i;
    int *pa;
    int *pb;
    int *pc;

    pa = a;
    pb = b;
    pc = c;
    for(i=0;i<NUM_EL;i++)
{
    *(pc +i)=*(pa +i)+*(pb +i);
}
}

配列を印刷するとき、最初の要素は常に の値として表示されますNUM_EL。これは、s を 0 から 1 の間で設定した場合でも発生randします。残りは、本来あるべきようにランダムです。コードは、合計配列を含む各配列の最初の要素を除いて完全に機能します。

4

2 に答える 2

4

関数を呼び出すときは、次のようにします。

*randomArray1=IntializeArrayWithPointers(randomArray1, 0, 1);

これにより、関数の戻り値が の最初の要素に割り当てられますrandomArray1。これは望ましくないため、割り当てを削除する必要があります。

実際、関数は値を返さないため、動作は未定義です。関数を return として宣言する必要がありますvoid

もう 1 つの問題は、関数宣言の型が関数定義の型と一致しないことです。常に一致していることを確認し、これを警告するコンパイラの警告に注意してください。

于 2013-05-02T09:34:44.390 に答える
0

*randomArray1=IntializeArrayWithPointers(randomArray1, 0, 1);

このステートメントは、関数の戻り値を randomArray1 の最初の要素に設定します。これが変更される理由です。

割り当てを削除し、戻り値の型を void にして IntializeArrayWithPointers() を宣言します。

于 2013-05-02T10:00:50.263 に答える