1

私の C プログラムでは、次の引数を指定して void 関数を使用しています。関数。したがって、動的配列は malloc を使用して関数内で作成され、関数を呼び出した後にその要素を main() に出力するまで、すべて正常に機能します。私が得るのは、私が見るはずの数字ではなくゴミです。関数コードは次のとおりです。

void availableMoves(int array[][3], int *av, int *counter)
{
    int i, j;
    for (i=0; i<3; i++)
    {
        for (j=0; j<3; j++)
        {
            if (array[i][j] == E)
            {
                printf("%d ", 3*i + j + 1);
                (*counter)++;
            }
        }
    }
    av = (int *) malloc(*counter * sizeof(int));
    if (av == NULL)
    {
        printf("ERROR!");
    }
    else
    {
        for (i=0; i<*counter; i++)
            *(av + i) = 0;
        int pos = 0;
        for (i=0; i<3; i++)
        {
            for (j=0; j<3; j++)
            {
                if (array[i][j] == E)
                {
                    *(av + pos++) = 3*i + j + 1;
                }
            }
        }
    }
}
4

2 に答える 2

2

この関数でavは、コピーによって渡されるポインターです。したがって、関数内でポインターの値を変更しても、元のポインターは変更されません。

2 つの可能性があります。

  • ポインターへのポインター ( int **av) を使用します。
  • 割り当てられたポインタ ( return av) を返します。

したがって、次のいずれかです。

void availableMoves(int array[][3], int **av, int *counter);

または:

int *availableMoves(int array[][3], int *av, int *counter)

そして呼び出し:

availableMoves(array, &av, &counter);
av = availableMoves(array, av, &counter);
于 2013-01-02T11:05:06.967 に答える
2

int **av代わりに動的配列にダブルポインターを使用しますint *av

void availableMoves(int array[][3], int **av, int *counter)

そして関数へのav変更*av

于 2013-01-02T11:02:23.613 に答える