正确地从函数传递数组

时间:2015-10-10 08:18:11

标签: c arrays function syntax

我有一些代码在一个名为array_generator的函数中生成一个size [user_input]数组,使用main()中scanf的数组大小,然后将数字0填入user_input(0,1,2, 3,如果用户输入是4)。当printf打印时,数组填充正确

`The array contains the value 1`
`The array contains the value 2`
`The array contains the value 3`, etc.

然而,当我将数组传递给main和printf数组值时,我得到的是带有垃圾数字的相等语句。我也90%肯定我已经错误地传递了数组和指针(对他们来说是新的)。

代码如下:

#include <stdio.h>

int *array_generator(int number_songs);

int main(void)
{
    int input;
    int *p;
    int i;
    int x;

    printf("Enter number of songs wanted in random playlist: ");
    scanf("%d", &input);

    p = array_generator(input);

    x = *p;

    for (i = 0; i < input; i++)
    {
        printf("The array contains the values %d\n", x);
    }

    return 0;
}

int *array_generator(int n)
{
    int a[n];
    int *p;
    int i;

    for (i = 0; i < n; i++)
    {
        a[i] = i;
        printf("The array contains the values %d\n", i);
    }

    return p = &a[n];
}

2 个答案:

答案 0 :(得分:1)

一个简单的解决方案是定义一个比合理可能的最大歌曲列表更大的数组。例如,由于您打印每个条目,超过几百个是不合理的。在现代计算机上空间很丰富。您可以在prog的顶部定义最大大小,或稍后在某些标题中定义:

#define MAX_SONGLIST_LEN 1000

数组可以是全局的,也可以是函数内部的静态数组。让我们把它设为静态,因为你希望函数返回地址。

变化很小。只是说

static int a[MAX_SONGLIST_LEN];

您可能想要更改循环并检查最大长度:

for (i = 0; i < input && i < MAX_SONGLIST_LEN; i++)

array_generator()main()内。您还可能希望通知用户最大值和捕获数量太大。 (您不会对用户输入进行任何错误处理 - 如果用户输入字母而不是数字会发生什么?查看scanf()的返回值。)

静态数组的生命周期是程序的生命周期。顺便说一句,它将被初始化为全零。如果您想随机初始化它,请查看rand()函数。

答案 1 :(得分:0)

你的指针错误是正确的。下面的代码预先形成了你想要的功能......

#include <stdio.h>

void array_generator(int n, int arr[]) {
    for (int i = 0; i < n; i++) {
        arr[i] = i;//array values
        //printf("The array contains the values %d\n", i);
    }
}

int main() {
    int input;

    printf("Enter number of songs wanted in random playlist: ");
    scanf("%d", &input);

    int array[input];//declare array with length of input

    array_generator(input, array);

    for(int i=0; i<sizeof(array)/sizeof(array[0]); i++) {//input could also be used at the limit to the for loop
        printf("%d", array[i]);
    }
    printf("\n");

    return 0;
}

您正在做的是使代码复杂化。您要做的第一件事是创建一个函数并尝试使其返回一个数组。这不是必需的。您需要做的就是将指针传递给数组,并且对数组的所有编辑都将在与声明数组相同的范围内进行。 您还提到要查找数组的大小。这可以使用任何类型的数组*asizeof(a)/sizeof(a[0])来完成。这可以通过返回数组使用的字节数除以数组中第一个元素使用的字节数来实现。

您不需要的另一件事是x = *p;。当你这样做时,你基本上就是这样做x=*p=array_gen(input);

可以找到有关C中指针的更多信息here