programing

구조물에 제로렝스 배열의 목적은 무엇입니까?

firstcheck 2022. 7. 2. 22:05
반응형

구조물에 제로렝스 배열의 목적은 무엇입니까?

Linux 커널 코드를 확인했을 때 다음 코드를 발견했습니다.

   struct thread_info {
    struct task_struct  *task;
    struct exec_domain  *exec_domain;
    unsigned long       flags;
    __u32           status;
    __u32           cpu;
    int         preempt_count;
    mm_segment_t        addr_limit;
    struct restart_block    restart_block;
    void __user     *sysenter_return;
    unsigned long           previous_esp;
    __u8            supervisor_stack[0];
};

마지막 변수 "supervisor_stack"은 길이가 0인 배열입니다. 사용법은 무엇입니까?잘 부탁드립니다!

GCC가 확장으로 제공하는 플렉시블 어레이 멤버의 C99 이전 버전입니다.

C99 방법은 빈 괄호로 플렉시블 어레이 멤버를 정의하는 것입니다.

__u8  supervisor_stack[];

구조물에 인접하지 않은 양의 데이터를 저장하는 데 사용됩니다.메모리는 다음 형식으로 할당됩니다.

struct foo *ptr = malloc(sizeof *ptr + whatever_is_needed);

6.7.2.1항 18에서 표준(초안 N1570)은 다음을 설명한다.

특별한 경우로서 복수의 이름 있는 멤버가 있는 구조의 마지막 요소는 불완전한 배열 타입을 가질 수 있습니다.이것은 플렉시블 배열 멤버라고 불립니다.대부분의 경우 유연한 어레이 멤버는 무시됩니다.특히 구조의 크기는 생략이 의미하는 것보다 더 많은 후행 패딩이 있을 수 있다는 점을 제외하고 플렉시블 배열 멤버를 생략한 것과 같습니다.다만,.(또는->) 연산자는 유연한 배열 부재를 가진 구조물에 대한 포인터(포인터)와 그 구성원에 대한 오른쪽 피연산자에 대한 이름을 가지고 있습니다.이것은 마치 그 부재가 액세스되는 객체보다 구조를 크게 하지 않는 가장 긴 배열(동일한 요소 유형)로 대체된 것처럼 동작합니다.배열의 오프셋은 th의 값으로 유지됩니다.e 교환 어레이와 다른 경우에도 유연한 어레이 멤버입니다.이 배열에 요소가 없는 경우 하나의 요소가 있는 것처럼 동작하지만 해당 요소에 액세스하거나 포인터를 생성하려고 하면 동작은 정의되지 않습니다.

가변 길이 배열(할당 시 크기를 정의함)이라고 할 수 있는 것을 선언하는 것은 일반적인 C 해킹입니다.

예:

struct line {
   int length;
   char contents[0];
 };

 struct line *thisline = (struct line *)
   malloc (sizeof (struct line) + this_length);
 thisline->length = this_length;

이렇게 하면 데이터의 구조 정의를 얻을 수 있습니다.이것에 의해, 명백한 대류 목적을 위해서 어레이의 길이도 보존됩니다만, 통상은 구조물에 관련 붙여진 고정 사이즈에 제약받지 않습니다.

여기서의 예(자세한 내용은 이쪽도 참조)

언급URL : https://stackoverflow.com/questions/11733981/what-is-the-purpose-of-a-zero-length-array-in-a-struct

반응형