初始化一组int

Mik*_*ike 32 c arrays initialization

有没有人有办法初始化一个ints 数组(任何多字节类型真的很好),简单到一个非零和非-1值?我的意思是,有没有办法在单个班轮中执行此操作,而无需单独执行每个元素:

int arr[30] = {1, 1, 1, 1, ...}; // that works, but takes too long to type

int arr[30] = {1}; // nope, that gives 1, 0, 0, 0, ...

int arr[30];
memset(arr, 1, sizeof(arr)); // That doesn't work correctly for arrays with multi-byte
                             //   types such as int
Run Code Online (Sandbox Code Playgroud)

仅供参考,memset()在静态数组上使用这种方式可以得到:

arr[0] = 0x01010101
arr[1] = 0x01010101
arr[2] = 0x01010101
Run Code Online (Sandbox Code Playgroud)

另一种选择:

for(count = 0; count < 30; count++)
   arr[count] = 1;    // Yup, that does it, but it's two lines.
Run Code Online (Sandbox Code Playgroud)

有没有其他想法?只要它是C代码,对解决方案没有限制.(其他libs很好)

iab*_*der 36

这是GCC扩展:

int a[100] = {[0 ... 99] = 1};
Run Code Online (Sandbox Code Playgroud)

  • 对于使用它的任何其他人都要注意,数字和`...`之间有空格,这很重要 (6认同)

Art*_*Art 23

for (count = 0; count < 30; count++) arr[count] = 1;
Run Code Online (Sandbox Code Playgroud)

一条线.:)

  • `一行.:)非常正确......这个解决方案遵循了法律条文 (5认同)

Omk*_*ant 20

你说了两行但你可以使用逗号,运算符在一行中完成.

for(count = 0; count < 30 ; arr[count] = 1,count++);
Run Code Online (Sandbox Code Playgroud)

  • 或者:`for(count = 0; count <30; arr [count ++] = 1);` (8认同)
  • 您也可以在一行中编写整个C程序.如果某人可以提供有关如何理解的理由,我会很高兴听到它. (4认同)

Lun*_*din 14

在初始化(而不是运行时)期间执行此操作的唯一合理方法似乎是:

#define ONE1     1
#define FIVE1    ONE1, ONE1, ONE1, ONE1, ONE1
#define TEN1     FIVE1, FIVE1
#define TWENTY1  TEN1, TEN1
#define FIFTY1   TWENTY1, TWENTY1, TEN1
#define HUNDRED1 FIFTY1, FIFTY1

int array [100][4] =
{
  HUNDRED1,
  HUNDRED1,
  HUNDRED1,
  HUNDRED1
};
Run Code Online (Sandbox Code Playgroud)

接下来,#define ONE2 2依此类推.你明白了.

编辑:我写这么多宏的原因是为了证明这个解决方案的灵活性.对于这种特殊情况,您不需要所有这些.但是对于像这样的宏,您可以快速灵活地编写任何类型的初始化列表:

{
  FIFTY1, FIFTY2,  // 1,1,1,1... 50 times, then 2,2,2,2... 50 times
  TWENTY3, EIGHTY4 // 3,3,3,3... 20 times, then 4,4,4,4... 80 times
  ... // and so on
};
Run Code Online (Sandbox Code Playgroud)

  • 非常简洁的解决方案,可读,可扩展和编译时! (2认同)

AnT*_*AnT 10

在C中,您通常使用宏来开发自己的"支持库"

#define SET_ALL(a_, n_, v_)\
  do { size_t i, n = (n_); for (i = 0; i < n; ++i) (a_)[i] = (v_); } while(0)

#define SET_ALL_A(a_, v_) SET_ALL(a_, sizeof(a_) / sizeof *(a_), v_)
#define ZERO_ALL(a_, n_) SET_ALL(a_, n_, 0)
#define ZERO_ALL_A(a_) SET_ALL_A(a_, 0)
Run Code Online (Sandbox Code Playgroud)

然后在你的代码中使用它们

int arr[30];

SET_ALL_A(arr, 1);
Run Code Online (Sandbox Code Playgroud)

  • 看到我发布的答案. (2认同)

Bar*_*ski 8

一行指针!

for (int *p = a; p < (a + 30); p++) *p = 1;
Run Code Online (Sandbox Code Playgroud)

或者,如果您过早地害怕因反复计算而导致的性能损失(a + 30):

for (int *p = a + 30 - 1; p >= a; p--) *p = 1;
Run Code Online (Sandbox Code Playgroud)