如何使用某些值初始化数组中的少数元素?

时间:2016-08-09 20:41:18

标签: c arrays initialization

这可能是一个愚蠢的问题,但是可以将某些值分配给数组而不是全部吗?澄清我想要的东西:

如果我需要像{1,0,0,0,2,0,0,0,3,0,0,0}这样的数组,我可以创建它:

int array[] = {1,0,0,0,2,0,0,0,3,0,0,0};

此数组的大多数值均为“0”。是否可以跳过此值并仅分配值1,2和3?我想到的是:

int array[12] = {0: 1, 4: 2, 8: 3};

4 个答案:

答案 0 :(得分:73)

  

是否可以跳过此值并仅指定值1,2和3?

在C中,是的。使用指定的初始值设定项(在C99中添加,在C ++中不受支持)。

int array[12] = {[0] = 1, [4] = 2, [8] = 3};  

以上初始值设定项将初始化数组0的元素48array,其值为12和{{1} } 分别。 Rest元素将使用3进行初始化。这相当于

0

最好的部分是列出元素的顺序并不重要。也可以像

一样写
 int array[12] = {1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0};   

但请注意 int array[12] = {[8] = 3, [0] = 1, [4] = 2}; 内的表达式应为整数常量表达式

答案 1 :(得分:13)

这是我琐碎的方法:

int array[12] = {0};
array[0] = 1; array[4] = 2; array[8] = 3;

但是,从技术上讲,这不是“初始化”数组:)

答案 2 :(得分:6)

另一种方法是为数组中的所有元素提供memset的默认值,然后分配特定元素:

int array[12];
memset(array, 0, sizeof(int) * 12); //if the default value is 0, this may not be needed
array[0] = 1; array[4] = 2; array[8] = 3;

答案 3 :(得分:0)

标准C17

该标准(C17,N2176)在第6.7.9(37)节中有一个有趣的示例:

示例13 可以使用单个指示符从数组的两端“分配”空间:

int a[MAX] = {
    1, 3, 5, 7, 9, [MAX-5] = 8, 6, 4, 2, 0
};

在上面,如果MAX大于10,将会有一些 中间的零值元素;如果少于十,一些 前五个初始化器提供的值将被覆盖 到第二五点。

示例

#include <stdio.h>

#define MAX 12

int main(void)
{
    // n2176, § 6.7.9(37)
    int a[MAX] = {
        1, 3, 5, 7, 9, [MAX-5] = 8, 6, 4, 2, 0
    };

    for (size_t i = 0; i < MAX; i++) {
        printf("%d\n", a[i]);
    }

    return 0;
}

输出:

1
3
5
7
9
0  <-- middle element, defaults to zero
0  <-- middle element, defaults to zero
8
6
4
2
0