无法将数组从另一个函数返回到主函数

时间:2019-09-14 16:33:24

标签: c arrays pointers

我一直在尝试传递我的数组地址以在主函数中打印数组值。但是它不起作用,因为它提示“按X.exe计数已停止工作”。它还显示一条警告消息,内容为“函数正在返回局部变量的地址”。我找不到问题。如果有人发现我的代码的指针相关问题,这将是有帮助的。

#include<stdio.h>

int * countBy(int x, int n)
{
    int arr[n];
    int count = x;

    for(int i = 0; i < n; i++)
    {
        arr[i] = count;
        count = count + x;
    }

    return arr;
}

int main()
{
    int x = 2, n = 10;
    int * prr;

    prr = countBy(x, n);

    for(int i = 0; i < 10; i++)
    {
        printf("%d ", prr[i]);
    }

    return 0;
}

2 个答案:

答案 0 :(得分:2)

您不能在C语言中返回数组。您要么需要在主函数中创建数组并将其传递给函数,要么使用动态分配。

传递输出数组:

void countBy(int x, int n, int *arr)
{
    int count = x;

    for(int i = 0; i < n; i++) {
        arr[i] = count;
        count = count + x;
    }
}

int main(void)
{
    int x = 2, n = 10;
    int arr[n];
    countBy(x, n, arr);
}

动态分配:

int * countBy(int x, int n)
{
    int *arr = malloc(n * sizeof(*arr));
    int count = x;

    for(int i = 0; i < n; i++) {
        arr[i] = count;
        count = count + x;
    }
    return arr;
}

int main(void)
{
    int x = 2, n = 10;
    int *prr;
    prr = countBy(x, n);
    free(prr); // Remember to use free to not cause memory leaks
}

答案 1 :(得分:1)

局部变量的生存期仅在定义它的块内部扩展。控件移出定义了局部变量的块之后,就不再分配变量的存储空间(不保证)。因此,在变量的生存期之外使用变量的内存地址将是不确定的行为。

另一方面,您可以执行以下操作,将int arr [n]替换为静态数组,但是必须声明该数组的大小。

...
static int arr[10];
...

这将解决问题,但如果用户输入所需的大小,则无法更改数组的大小。