[c] 구조체 선언이 끝날 때 [1]의 목적은 무엇입니까?

내 MSP430 마이크로 컨트롤러의 헤더 파일을 스누핑하고 있었고 다음에서이 문제를 만났습니다 <setjmp.h>.

/* r3 does not have to be saved */
typedef struct
{
    uint32_t __j_pc; /* return address */
    uint32_t __j_sp; /* r1 stack pointer */
    uint32_t __j_sr; /* r2 status register */
    uint32_t __j_r4;
    uint32_t __j_r5;
    uint32_t __j_r6;
    uint32_t __j_r7;
    uint32_t __j_r8;
    uint32_t __j_r9;
    uint32_t __j_r10;
    uint32_t __j_r11;
} jmp_buf[1]; /* size = 20 bytes */

나는 그것이 익명의 구조체를 선언하고 typedef가에 대한 것이라는 것을 이해하지만 그것이 jmp_buf무엇인지 알 수는 없습니다 [1]. 나는 그것이 jmp_buf하나의 멤버 (이 익명 구조체의)를 가진 배열 이라고 선언 한다는 것을 알고 있지만 그것이 무엇을 위해 사용되는지 상상할 수 없습니다. 어떤 아이디어?



답변

이것은 C에서 “참조 유형”을 만드는 일반적인 방법입니다. 여기서이를 함수 인수로 사용하면 프로그래머가 &해당 주소를 얻기 위해 연산자를 명시 적으로 사용할 필요없이 단일 요소 배열이 첫 번째 요소에 대한 포인터로 저하됩니다 . 선언 된 경우 실제 스택 유형 (동적 할당 필요 없음)이지만 인수로 전달 될 때 호출 된 함수는 복사본이 아닌 포인터를 수신하므로 저렴하게 전달됩니다 (그렇지 않으면 호출 된 함수에 의해 변경 될 수 있음). const).

GMP는 mpz_t유형 과 동일한 트릭을 사용하며 구조가 동적으로 할당 된 메모리에 대한 포인터를 관리하기 때문에 중요합니다. mpz_init기능은 그것의, 구조에없는 복사본을 포인터를 얻기에 의존하거나 전혀를 초기화 할 수 없습니다. 마찬가지로 많은 작업이 동적으로 할당 된 메모리의 크기를 조정할 수 있으며 호출자의 구조체를 변경할 수없는 경우 작동하지 않습니다.


답변