【问题标题】:How to initialize an array with only -1 values [duplicate]如何初始化只有-1值的数组[重复]
【发布时间】:2012-11-09 22:29:03
【问题描述】:

可能重复:
How to initialize an array in C
initializing an array of ints

我想知道将 int 数组初始化为仅包含 -1 值的最快/最简单方法。我需要的数组长 90 个整数,所以直接的方法应该是像这样初始化它:

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

但我只想使用一次数组所以我希望能够动态使用它并能够在程序中使用它后释放它,所以我更多地寻找像calloc这样的快速方法,但是零,当然是-1。

【问题讨论】:

标签: c arrays


【解决方案1】:

如果您使用 gcc,请使用 designated initializer

int array[90] = { [ 0 ... 89 ] = -1}

int array[90],i;
for(i = 0; i < 90 ; arr[i++] = -1);

要动态执行此操作,您必须使用 malloc 进行分配,然后仅释放内存,否则释放未由 malloccallocrealloc 分配的内存是未定义的行为。

使用这个:

int *array;
array=malloc(sizeof(int)*n);
for(i=0;i<n;array[i++]=-1);
// After use free this
free(array);

【讨论】:

  • 不错的提示,但我认为您错过了什么?即我希望能够动态使用它并能够在之后释放它
  • 你也可以动态完成
  • 是的,但你不能释放int array[90] = ....。此外,memset 被优化为每个 cpu 操作复制许多字节。 for 循环需要 90 次迭代,因此除非编译器为您展开循环,然后进一步优化它,否则如果您“自己动手”,您将花费更长的时间。如果你愿意,我会找到一个参考。
  • @enhzflep:查看我对动态数组的编辑
  • memset 仅适用于设置 0、-1 和所有其他整数中 4 个字节相同的数字,但不能作为通用解决方案。
【解决方案2】:

如果不显式枚举所有初始化器,就不可能在标准 C 中进行初始化。

在 GNU C 中,您可以使用 GNU C designated initializers

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

初始化后:

   int i;

   for (i = 0; i < sizeof array / sizeof *array; i++)
   {
       array[i] = -1;
   }

【讨论】:

  • memset 方法对我来说似乎有点骇人听闻。确实,-1 被表示为一个字节序列,它们的值都为 -1,但它起作用的原因并不明显,恕我直言。
  • @ruakh 我同意。而且它在二进制补码之外是不可移植的。我有点认为这是一个char 数组,但对于int 数组,我认为for 循环更好。我更新了我的答案以使用循环而不是 memset 调用。
  • @ouah 之后我可以释放这个数组吗?
【解决方案3】:

写这个很痛苦,但你总是可以使用宏

#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);

【讨论】:

    【解决方案4】:

    90 个单词的内存并不多。您可能会花费大部分时间来分配/取消分配内存。将它放在堆栈上可能比动态创建内存要快。我会看看 for 循环或 Omkant 的答案是否有效。如果它确实是瓶颈,那么您可以开始优化。

    for (i = 0; i < 90; ++i) { array[i] = -1; }
    

    【讨论】:

      【解决方案5】:
      memset( array, -1 , sizeof(array) ) ;
      

      可用于0或-1初始化

      【讨论】:

      • 你将如何使用它来初始化一个带有1的数组?
      • memset(array, 1, sizeof(array)) ;用全 1 初始化一个数组。
      • 不,这行不通。试试吧;如果你有 32 位整数,它会将它们全部初始化为 16843009!
      • 是的,正确,正在编辑我的帖子!
      【解决方案6】:

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

      你可以的

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

      memset(array,-1,sizeof(int)*size);
      

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

      【讨论】:

        猜你喜欢
        • 2013-12-01
        • 2019-10-07
        • 1970-01-01
        • 2014-09-23
        • 2014-04-22
        • 2018-08-09
        • 2016-09-10
        • 2014-10-13
        • 2012-05-26
        相关资源
        最近更新 更多