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

让我们说我宣布并初始化

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

我怎么能一下子把整个arrays一下子? 即

 a = {3, 2, 1}; 

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

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

如果你不打算在那里粘贴任何变量(你可以; C99不是很神奇吗?), (int[])可以替换为(const int[])将文字放入静态内存中。

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

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

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

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

复合文字在n869.txt的6.5.2.5节中讨论

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

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

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

 #include  #include  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 

你不能这样做。 只能从声明器初始化程序中的大括号表达式初始化数组。 您分配数组。

在C89中甚至没有“临时arrays”这样的东西,尽管从C99开始,这些依赖于复合文字 (参见@ Dave的回答)。