使用单个语句分配整个数组

时间:2011-12-05 02:20:25

标签: c

让我们说我宣布并初始化

int a[3] = {1, 2, 3};

我怎么能一下子把整个阵列一下子?即。

a = {3, 2, 1};

5 个答案:

答案 0 :(得分:13)

如果您的c编译器支持复合文字,您可以使用memcpy

memcpy(a, (int[]){3, 2, 1}, sizeof a);

如果你不打算在那里插入任何变量(你可以; C99不是很神奇吗?),(int[])可以用(const int[])代替,将文字放入静态内存。 / p>

答案 1 :(得分:4)

复合文字是ANSI C(C99)的一部分。由于它是语言的一部分,任何声称符合C99的编译器都必须支持这一点:

memcpy(a,(int []){3,2,1},sizeof a);

可以将gcc调用为“gcc -Wall -W -std = c99 -pedantic”来指定标准。

由于距离C99已超过11年,我认为开始使用该语言提供的新功能是安全的,也许是一个好主意。

复合文字在n869.txt

的第6.5.2.5节中讨论

答案 2 :(得分:3)

你不能;如果值完全相同(并且每个元素都是一个字节大),你需要使用类似memset的东西,或者如果它们不是一个大字节,那么你需要使用简单的for循环,如果数字可以是计算。如果无法在运行时计算这些值,则需要像a[x] = y;一样手动完成每个值。

它们被称为“初始化列表”的原因是因为它们可用于初始化某些内容,并且按定义初始化只发生一次。

答案 3 :(得分:1)

你做不到。数组只能从声明器初始值设定项中的大括号表达式初始化。您分配数组。

在C89中甚至没有“临时阵列”这样的东西,尽管从C99开始这些依据compound literals存在(参见@ Dave的回答)。

答案 4 :(得分:1)

这是一种不可移植的方式,严格来说,也可能涉及未定义的行为:

#include <stdio.h>
#include <string.h>

int main(void)
{
  int a[3] = { 1, 2, 3 };
  printf("%d,%d,%d\n", a[0], a[1], a[2]);
  // assuming ints are 4-bytes-long, bytes are 8-bit-long and
  // the byte order in ints is from LSB to MSB (little-endian):
  memcpy(a, "\x03\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00", sizeof(a));
  printf("%d,%d,%d\n", a[0], a[1], a[2]);
  return 0;
}

输出:

1,2,3
3,2,1