通过C中的void函数返回动态数组

时间:2013-01-02 11:00:28

标签: c malloc return void

在我的C程序中,我使用带有以下参数的void函数: 一个2D int数组,一个用于创建新动态数组的int指针和一个最后一个int指针,它将包含将在函数内部发生的许多计数。 所以使用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;
                }
            }
        }
    }
}

2 个答案:

答案 0 :(得分:2)

为动态数组int **av而不是int *av

使用双指针
void availableMoves(int array[][3], int **av, int *counter)

并按av

进入功能更改*av

答案 1 :(得分:2)

在此函数中,av是通过副本传递的指针。因此,当您在函数内更改指针的值时,原始指针将不会被修改。

有两种可能性:

  • 使用指向指针(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);