programing

구조체 배열 끝에 빈 중괄호 '{ }'가 필요한 이유는 무엇입니까?

randomtip 2022. 9. 1. 23:06
반응형

구조체 배열 끝에 빈 중괄호 '{ }'가 필요한 이유는 무엇입니까?

Linux 커널에서 몇 c코드를 눌렀습니다.

static struct ctl_table ip_ct_sysctl_table[] = {
    {
        .procname   = "ip_conntrack_max",
        .maxlen     = sizeof(int),
        .mode       = 0644,
        .proc_handler   = proc_dointvec,
    },
    // ...
    {
        .procname   = "ip_conntrack_log_invalid",
        .maxlen     = sizeof(unsigned int),
        .mode       = 0644,
        .proc_handler   = proc_dointvec_minmax,
        .extra1     = &log_invalid_proto_min,
        .extra2     = &log_invalid_proto_max,
    },
    { }
};

여기서 일련의 구조는 다음과 같이 끝납니다.{ }어떤 목적으로 추가되었습니까?
참고로 이 코드보다 조금 위에 다른 구조체 배열이 있지만 끝에는 빈 괄호가 없습니다.

구조체 배열 끝에 빈 괄호를 사용해야 할 때는 언제입니까?

이 특별한 변경은 sysctl net의 일부였습니다.Eric W. Biedman에 의해 커밋된 사용되지 않은 바이너리 sysctl 코드삭제하여 의 마지막 요소의 초기화를 변경합니다.ip_ct_sysctl_table에서 배열하다.{0}로.{}(다른 많은 어레이 초기화와 유사한 변경을 수행합니다).

{0}패턴이 훨씬 더 오래 지속된 것 같습니다, 그리고 둘 다.{0}또는{}final element-initialization은 일반적으로 (Linux 소스 코드에서) 명시적으로 다음과 같이 불립니다.Terminating entry따라서 이러한 어레이의 길이를 파악하지 않고 소비할 수 있는 패턴이 존재하기 때문에 제로 초기화 종료 엔트리에 도달하면 소비는 종료됩니다.예를 들어, 제로 초기화를 의도한 유사한 어레이에 대해서는 코멘트에 다음과 같이 명시되어 있습니다.

static struct codec_connection toonie_connections[] = {
  {
      .connected = CC_SPEAKERS | CC_HEADPHONE,
      .codec_bit = 0,
  },
  {} /* terminate array by .connected == 0 */
};

0 끝 문자열에 대해 잘 알고 계실 겁니다. ctl_table ip_ct_sysctl_table[]는 제로 종단 배열입니다.즉, 마지막 배열 엔트리의 멤버는 모두 제로입니다.

구조체 배열 끝에 빈 중괄호 '{ }'가 필요한 이유는 무엇입니까?

명확히 하자면, "구조체 배열 끝의 빈 괄호 '{ }'는 C 구문 요건을 충족하기 위해 필요하지 않습니다.

구조체 배열 끝에 빈 괄호를 사용해야 할 때는 언제입니까?

코드가 센티넬 값을 필요로 하는 경우.

프로그램에 모든 0의 최종 배열 요소를 갖는 것이 유용할 수 있습니다. - 확실히 그 끝을 감지하기 위해서입니다.이러한 요구는 애플리케이션의 어레이 사용에서 비롯됩니다.ctl_table ip_ct_sysctl_table[]C언어 요구가 아닙니다.

어레이의 요소 수를 1개 늘리기 위해 어레이 끝에 0으로 초기화된 요소가 1개 있습니다.

이 작은 데모를 생각해 보세요.

#include <stdio.h>

struct Test
{
  int x;
  int y;
} arr[] =
{
    {1,2},
    {3,4},
//  {}
};

int main(void) {
    printf("%zu\n", sizeof(arr) / sizeof(arr[0]));
    return 0;
}

의 크기arr코멘트를 해제하면 어레이가 변경됩니다.{}어레이 초기화 리스트의 마지막에 표시됩니다.

출력:

와 함께// {}(어레이에는 2개의 요소가 있습니다)

2

와 함께{}(어레이에는 3가지 요소가 있습니다)

3

상세설명:

ip_ct_sysctl_table레음

in->ctl_table = kmemdup(ip_ct_sysctl_table,
                sizeof(ip_ct_sysctl_table),
                GFP_KERNEL);

★★★★★★{}.ip_ct_sysctl_table.

언급URL : https://stackoverflow.com/questions/60489448/what-is-the-need-of-empty-braces-at-the-end-of-array-of-structs

반응형