Python 在C中填充数组:创建静态局部变量还是通过指针传递数组更好
我目前正在用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 } 作为另
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];…
不会编译,因为您不能拥有一个(whichar[dim];
定义)声明为static
。返回静态变量的地址是可以的,只要它满足您的多线程要求,等等。这是一个永远不应该返回的自动变量的地址。您可能还注意到,参数列表中dim
的“隐式int
”在C89/C90中已经过时并从C99中正式删除。请参阅。请注意,在第二种解决方案中,函数不接收指向特定类型数组的s指针,而只接收指向其第一个元素的指针。因此,函数不知道要初始化的数组元素数。sizeof
运算符在这里没有帮助,因为它只提供了数组的大小指针或它所指向的元素。在给出注释/答案后,请不要对问题进行重大编辑,因为这可能会导致注释/答案无法理解。通过向问题添加更新来应用更改。请相应地调整上次更改。