函数返回数组

时间:2016-04-20 22:21:02

标签: c arrays function pointers

我需要我的函数返回一个数组,然后进入下一个函数。我知道根据一些研究,我必须使用指针来完成这项工作。但是当我运行这段代码时,我得到的是内存地址,或者在我的结果中看到的内存地址(如果它的地址不是很大的数字)。

当阵列需要更改功能时会发生问题。两个单独的功能按预期正常运行。

这是我的代码:

int main(void) 
{
    int y = 0, x[10];
    int *p;
    y = capturingNumberTimesLoopRuns();
    p = PopulateArray(y);
    searchArray(x);
}

int capturingNumberTimesLoopRuns (void)
{
    int y = 0;
    while (y == 0) 
    {
        printf("Please enter the quantity of numbers you wish to enter.\n");
        printf("Enter a number between 1 and 10: ");
        scanf("%d", &y);
        if (y < 1 || y > 10)
        {
            printf("Invalid Selection! Please Try Again.\n");
            y = 0;
        }
    }
    return y;
}

int * PopulateArray(int y) 
{
    int i;
    int x[10];
    int a = 1;
    for (i = 0; i < y; i++) 
    {
        printf("Please enter number %d: ", a);
        scanf("%d", &x[i]);
        a++;
    }
    return x;
}

void searchArray(int x[]) 
{
    int i, a = 0, numberOfTimes = 0, average = 0;
    for (i = 0; x[i] != 0; i++) 
    {
        if (x[i] % 3 == 0) 
        {
            a += x[i];
            numberOfTimes += 1;
        }
    }
    average = a / numberOfTimes;
    printf("%d\n", a);
    printf("average = %d", average);
}

2 个答案:

答案 0 :(得分:2)

你的研究是正确的。在函数内处理数组操作的方法是将指向数组的指针传递给函数。然后,您可以在函数中随意操作数组,而无需在函数返回时返回指针。 (当然,为了方便,您仍然可以返回指向数组的指针)

除了将指针传递给您的数组之外,您还需要传递数组的大小(或者使用全局来跟踪数组的大小 - 因为除非完全必要,否则不要使用全局变量)。例如,您的populatearray函数可以编写如下:

/* pass pointer to array and size to function */
int *populatearray (int *x, int sz) 
{
    int i, a = 1;

    for (i = 0; i < sz; i++)     {
        printf ("Please enter number %2d: ", a++);
        scanf ("%d", &x[i]);
    }

    return x;
}

(这里的返回是为了方便而不是必需的,因为你的数组是在main()中声明的)

这允许您避免动态分配,维护指向已分配的内存块的指针以及在不再需要时释放该内存的责任。动态分配内存没有任何问题,但它是新C程序员必须处理的额外复杂层。

使用populatearray的简短示例可以如下工作:

#include <stdio.h>

enum { MAXI = 10 };  /* avoid 'magic' numbers, use proper constants */

int *populatearray (int *x, int y);
void prnarray (int *x, int sz);

int main (void) {

    int x[MAXI] = {0};

    populatearray (x, MAXI);
    prnarray (x, MAXI);

    return 0;
}

/* pass pointer to array and size to function */
int *populatearray (int *x, int sz) 
{
    int i, a = 1;

    for (i = 0; i < sz; i++)     {
        printf ("Please enter number %2d: ", a++);
        scanf ("%d", &x[i]);
    }

    return x;
}

/* pass pointer to array and size to function */
void prnarray (int *x, int sz) 
{
    int i;
    for (i = 0; i < sz; i++)
        printf (" x[%2d] : %d\n", i, x[i]);
}

示例使用/输出

$ ./bin/array_pass
Please enter number  1: 10
Please enter number  2: 20
Please enter number  3: 30
Please enter number  4: 40
Please enter number  5: 50
Please enter number  6: 60
Please enter number  7: 70
Please enter number  8: 80
Please enter number  9: 90
Please enter number 10: 100
 x[ 0] : 10
 x[ 1] : 20
 x[ 2] : 30
 x[ 3] : 40
 x[ 4] : 50
 x[ 5] : 60
 x[ 6] : 70
 x[ 7] : 80
 x[ 8] : 90
 x[ 9] : 100

(虽然不是错误,但C的标准编码样式避免使用caMelCase变量支持所有小写。请参阅例如NASA - C Style Guide, 1994

如果您有任何其他问题,请与我们联系。

答案 1 :(得分:1)

当函数由于其自动存储而返回时,数组将被销毁。尝试从堆中动态分配内存(即malloc()):

int * PopulateArray(int y) 
{
    int i;
    int *x = malloc(10*sizeof(int));

    int a = 1;
    for (i = 0; i < y; i++) 
    {
        printf("Please enter number %d: ", a);
        scanf("%d", &x[i]);
        a++;
    }
    return x;
}