Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在C中填充数组:创建静态局部变量还是通过指针传递数组更好_Python_C_Arrays_Pointers_Static - Fatal编程技术网

Python 在C中填充数组:创建静态局部变量还是通过指针传递数组更好

Python 在C中填充数组:创建静态局部变量还是通过指针传递数组更好,python,c,arrays,pointers,static,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 } 作为另

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

int *fillArray(dim)
{
    static int ar[dim];
    // fill the array ar in some way
    return ar;
}
使用静态填充数组没有多大意义。每次调用此函数时,都将返回相同的数组(静态数组的相同地址)。因此,多次调用返回静态变量的
fillArray
,实际上可能会破坏以前对数组的使用。此外,您最好不要返回本地定义的变量的地址


另外,第二个
fillArray
函数很有意义,因为它实际上可以重用

正如@alk所建议的,第一个解决方案甚至没有编译。因此,第二种解决方案是强制性的,至少对VLA来说是这样。

您的
fillArray
函数是不正确的:具有
静态
持续时间的对象的大小必须在编译时已知。此外,user3150716建议asa,返回带有静态存储的本地对象的地址将每次返回相同的数组,这可能不是目的

您应该使用不同的方法:

  • 编写一个函数来分配一个新数组
  • 使用其他函数初始化数组,并将其大小作为参数传递
以下是一个例子:

#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);
}
#包括
int*fillArray(int*array,size\u t size){
if(数组!=NULL){
对于(大小i=0;i

请注意,使用
calloc(size,sizeof(int))

第一个示例是否编译?我看不出它是静态的,并且维度可变。如果使用
static int-ar[dim]
将只有一个
ar
,即使多次调用
fillArray
。你确定这就是你想要的吗?请看,这也意味着这两个函数的作用非常不同。谢谢,我不太习惯C。因此,在这种情况下,第二个选项似乎是强制性的。除了
dim
缺少类型之外,我怀疑这
int*fillArray(dim){static int ar[dim];…
将编译。据我所知,不能将VLA声明为静态。这应该如何工作?缺少的类型不是我的重点。这仍然是
int*fillArray(int dim){static int ar[dim];…
不会编译,因为您不能拥有一个(which
ar[dim];
定义)声明为
static
。返回静态变量的地址是可以的,只要它满足您的多线程要求,等等。这是一个永远不应该返回的自动变量的地址。您可能还注意到,参数列表中
dim
的“隐式
int
”在C89/C90中已经过时并从C99中正式删除。请参阅。请注意,在第二种解决方案中,函数不接收指向特定类型数组的s指针,而只接收指向其第一个元素的指针。因此,函数不知道要初始化的数组元素数。
sizeof
运算符在这里没有帮助,因为它只提供了数组的大小指针或它所指向的元素。在给出注释/答案后,请不要对问题进行重大编辑,因为这可能会导致注释/答案无法理解。通过向问题添加更新来应用更改。请相应地调整上次更改。