我想扩展solution我发现从函数返回一个数组,所以我有一个函数创建一个数组,其长度是提供给这个函数的。
但是现在,如果我这样调用这个函数,我会收到警告,“长度”是未声明的。
double * my_function(int length)
{
static double arr[length] = {0};
return arr;
}
如何避免这种行为?
答案 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?
并且如上所述,因为您声明一个静态数组,所以程序需要在编译时知道数组的长度