我目前正在C中编写一个简单的函数,它以这种方式构造:
int *fillArray(int dim)
{
static int ar[dim];
// fill the array ar in some way
return ar;
}
通常说不鼓励在本地函数中使用static
关键字。我想知道以经典的方式做得更好:
void fillArray(int *ar, int dim)
{
// fill the array ar in some way
}
另外,考虑到我后来想要在Python代码中包装函数,而Python函数不应该使用参数。
答案 0 :(得分:1)
int *fillArray(dim)
{
static int ar[dim];
// fill the array ar in some way
return ar;
}
使用静态填充数组没有多大意义。每次调用此函数时,都将返回相同的数组(静态数组的相同地址)。因此,多次调用返回静态变量的fillArray
实际上可能会破坏先前对数组的使用。此外,理想情况下,您应该永远不会返回本地定义的变量的地址。
此外,第二个fillArray
函数非常有意义,因为它实际上可以重用。
答案 1 :(得分:0)
正如@alk所建议的那样,第一个解决方案甚至都没有编译。因此,第二种解决方案是强制性的,至少对VLA来说是这样。
答案 2 :(得分:0)
您的fillArray
函数不正确:必须在编译时知道持续时间static
的对象的大小。此外,正如user3150716所建议的那样,返回具有静态存储的本地对象的地址将每次返回相同的数组,这可能不是意图。
您应该采用不同的方法:
以下是一个例子:
#include <stdlib.h>
int *fillArray(int *array, size_t size) {
if (array != NULL) {
for (size_t i = 0; i < size; i++)
array[i] = 0;
}
}
return array;
}
int *newArray(size_t size) {
return fillArray(malloc(size * sizeof(int)), size);
}
void freeArray(int *array) {
free(array);
}
请注意,可以使用calloc(size, sizeof(int))
在一个步骤中将数组分配和初始化为0。