如何在函数中生成数组并将其返回

时间:2013-11-15 16:37:13

标签: c pointers

我想扩展solution我发现从函数返回一个数组,所以我有一个函数创建一个数组,其长度是提供给这个函数的。

但是现在,如果我这样调用这个函数,我会收到警告,“长度”是未声明的。

double * my_function(int length)
{
    static double arr[length] = {0};

    return arr;
}

如何避免这种行为?

5 个答案:

答案 0 :(得分:2)

静态数组必须具有编译时已知的长度。使用普通的自动数组,您可以指定一个可变长度,但这是一个特殊的C99功能,称为“可变长度数组”,或简称为VLA。

不可能使用可变长度静态数组,因为即使在允许程序运行之前,也必须分配它们的存储空间。

自动(本地)可变长度数组是可能的,因为它只是意味着通过变量而不是常量递增/递减堆栈指针。但是,这仍然是一件危险的事情,因为如果长度值较大,你可以很容易地超出可用的堆栈空间。

答案 1 :(得分:2)

如果要分配可变长度数组,为什么不使用calloc?

double * my_function(size_t length)
{
    double *arr;    
    arr = calloc(length, sizeof *arr);
    return arr;
}
完成之后

free()arr并在使用之前检查它是否为NULL。

答案 2 :(得分:1)

查看malloc。 * alloc函数用于动态创建数组。它们是在名为 heap 的东西上创建的,当你编程时,你需要确保在堆上分配的东西得到正确的关注,否则你就可以开始出现内存泄漏。在你的情况下,你通过使它静止来稍微处理它。另一个主要的做法是让函数的调用者在使用它时释放内存。

您的用法应该是这样的:

double * my_function(int length)
{
    static double * arr = NULL;
    if (arr == NULL) {
        arr = malloc(length * sizeof(double));
    }
    return arr;
}

注意,通过使用静态并像我一样将包装器放在它周围,这是设置arr以适应单件设计。

非单身人士的替代方案是:

double * my_function(int length)
{
    static double * arr = NULL;
    if (arr != NULL) {
        free(arr);
    }
    arr = malloc(length * sizeof(double));
    return arr;
}

每次调用时都会重新分配。保存my_function返回值的任何函数都会发现它已过时。

答案 3 :(得分:0)

首先,这不是ANSI C(据我记得)。您不能声明大小不是编译时常量的数组。

其次,这种方法一般被认为非常糟糕,因为它实现了一个非线程安全的函数。使用此函数的多个线程将破坏此数组中的每个其他数据。

正确的通用方法是在函数内使用malloc()/calloc()分配数组。根据您尝试解决的问题和性能要求,您可以考虑进行各种优化以避免重复/频繁分配。

答案 4 :(得分:0)

出于好奇,你为什么不使用malloc?

并且如上所述,因为您声明一个静态数组,所以程序需要在编译时知道数组的长度