source

배열의 일부 요소만 일부 값으로 초기화하는 방법은 무엇입니까?

factcode 2023. 6. 18. 16:22
반응형

배열의 일부 요소만 일부 값으로 초기화하는 방법은 무엇입니까?

모두가 아닌 일부 값을 배열에 할당할 수 있습니까?내가 원하는 것을 명확히 하기 위해:

다음과 같은 배열이 필요한 경우{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};

이 값을 건너뛰고 값 1, 2 및 3만 할당할 수 있습니까?

C에서, 네.지정된 이니셜라이저(C99에 추가되고 C++에서는 지원되지 않음)를 사용합니다.

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

위의 이니셜라이저는 요소를 초기화합니다.0,4그리고.8정렬된array가치 있는1,2그리고.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}; 

하지만 그 안에 있는 표현은[ ]정수 상수 식이어야 합니다.

제 사소한 접근법은 다음과 같습니다.

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

하지만 엄밀히 말하면, 이것은 배열을 "초기화"하는 것이 아닙니다 :)

이 작업을 수행하는 다른 방법은 다음과 같이 기본값을 제공하는 것입니다.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;

표준 C17

이 표준(C17, N2176)은 § 6.7.9(37)에 흥미로운 예가 있습니다.

13 단일 지정자를 사용하여 배열의 양 끝에서 공간을 "할당"할 수 있습니다.

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

위에서, 만약.MAX10보다 크면 중간에 일부 0 값 요소가 있습니다. 10보다 작으면 처음 5개의 이니셜라이저에서 제공한 값 중 일부가 두 번째 5에 의해 재정의됩니다.

#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

언급URL : https://stackoverflow.com/questions/38860046/how-to-initialize-only-few-elements-of-an-array-with-some-values

반응형