C 如何仅使用-1值初始化数组

C 如何仅使用-1值初始化数组,c,arrays,C,Arrays,可能重复: 我想知道如何最快/最简单地初始化一个int数组,使其只包含-1个值。我需要的数组长度为90 int,因此最简单的方法应该是如下初始化它: int array[90]={-1, -1, -1, ...}; 但是我只想使用一次数组,这样我就可以动态地使用它,并且在程序中使用它之后可以释放它,所以我更想寻找一种像calloc这样的快速方法,而不是零,-1当然。在初始化时,如果不显式枚举所有初始值设定项,就不可能在标准C中执行此操作 在GNUC中,您可以使用GNUC 初始化后:

可能重复:

我想知道如何最快/最简单地初始化一个int数组,使其只包含-1个值。我需要的数组长度为90 int,因此最简单的方法应该是如下初始化它:

int array[90]={-1, -1, -1, ...};

但是我只想使用一次数组,这样我就可以动态地使用它,并且在程序中使用它之后可以释放它,所以我更想寻找一种像
calloc
这样的快速方法,而不是零,-1当然。

在初始化时,如果不显式枚举所有初始值设定项,就不可能在标准C中执行此操作

在GNUC中,您可以使用GNUC

初始化后:

   int i;

   for (i = 0; i < sizeof array / sizeof *array; i++)
   {
       array[i] = -1;
   }
inti;
对于(i=0;i
如果您使用的是gcc,则使用


它可以用0或-1初始化90个字没有太多内存。您很可能会占用大部分时间来分配/取消分配内存。将其放在堆栈上可能比动态创建内存更快。我想看看for循环或Omkant的答案是否有效。如果事实证明它确实是瓶颈,那么您可以开始优化

for (i = 0; i < 90; ++i) { array[i] = -1; }
(i=0;i<90;++i){array[i]=-1;}
写这篇文章很痛苦,但你可以使用宏

#define FILL(arr, val) \
for(int i_##arr = 0; i_##arr < sizeof arr / sizeof *arr; ++i_##arr) \
{ \
    arr[i_##arr] = val;\
}

没有简单的方法,calloc只初始化为0

你能行

int *array = malloc(sizeof(int)*size);
for (i=0;i<size;i++) array[i] = -1;

您可以使用memset,但它只在您想使用值“0”或“-1”时才起作用,否则它将无法按预期工作,因为memset为所有字节设置了相同的值。

我觉得
memset
的方法有点老土。确实,
-1
表示为一个字节序列,所有字节的值都是
-1
,但它工作的原因一眼就不明显了。@ruakh我同意这一点。而且它不能在2的补码之外携带。我有点认为它是一个
char
数组,但对于
int
数组,我认为
for
循环更好。我更新了我的答案,以使用循环而不是
memset
调用。@ouah我可以在之后释放此数组吗?如何使用它初始化带有
1
的数组?memset(array,1,sizeof(array));用所有1初始化数组。不,那不行。试试看;如果您有32位整数,它会将它们全部初始化为
16843009
!是的,正确,编辑我的帖子!好消息,但我想你错过了什么?也就是说,我希望能够动态地使用它,并且在你可以动态地使用它之后能够释放它。确实如此,但是你不能释放
int-array[90]=..
。此外,memset经过优化,可以在每个cpu操作中复制许多字节。for循环需要90次迭代,因此,除非编译器为您展开循环,然后进一步优化它,否则如果您“自行展开”,则需要更长的时间。如果您愿意,我会找到一个引用。@enhzflep:see my edit for dynamic arraymemset仅适用于设置0、-1以及整数中4字节相同的所有其他数字,但不能作为一般解决方案。另一个:
memset( array, -1 , sizeof(array) ) ;
for (i = 0; i < 90; ++i) { array[i] = -1; }
#define FILL(arr, val) \
for(int i_##arr = 0; i_##arr < sizeof arr / sizeof *arr; ++i_##arr) \
{ \
    arr[i_##arr] = val;\
}
int array[90];
FILL(array, -1);
int *array = malloc(sizeof(int)*size);
for (i=0;i<size;i++) array[i] = -1;
memset(array,-1,sizeof(int)*size);