用C填充数组:创建静态局部变量或通过指针传递数组更好

时间:2017-02-04 08:21:15

标签: python c arrays pointers static

我目前正在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函数不应该使用参数。

3 个答案:

答案 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。