programing

구조 선언 끝에 있는 이 [1]의 목적은 무엇입니까?

itsource 2022. 9. 24. 23:48
반응형

구조 선언 끝에 있는 이 [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에서 "참조 유형"을 만들기 위한 일반적인 트릭입니다. 여기서 함수 인수로 사용하면 프로그래머가 명시적으로 사용할 필요 없이 단일 요소 배열이 첫 번째 요소에 대한 포인터로 저하됩니다.&operator 를 지정해, 주소를 취득합니다.선언된 경우에는 실제 스택타입(동적 할당이 필요 없음)이지만, 인수로 전달된 경우, 호출된 함수는 복사가 아닌 포인터를 수신하기 때문에 저렴하게 전달됩니다(그렇지 않은 경우 호출된 함수에 의해 변환될 수 있습니다).const).

GMP 에서는, 같은 트릭을 사용하고 있습니다.mpz_t이 구조체는 동적으로 할당된 메모리에 대한 포인터를 관리하기 때문에 type이 매우 중요합니다.mpz_init이 함수는 구조에 대한 포인터를 얻는데 의존하며 복사본이 아닙니다. 그렇지 않으면 전혀 초기화할 수 없습니다.마찬가지로, 많은 작업이 동적으로 할당된 메모리의 크기를 조정할 수 있으며, 호출자의 구조를 변환하지 못하면 작동하지 않습니다.

언급URL : https://stackoverflow.com/questions/47086406/whats-the-purpose-of-this-1-at-the-end-of-struct-declaration

반응형