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


96

내 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하나의 멤버 (이 익명 구조체의)를 가진 배열 이라고 선언 한다는 것을 알고 있지만 그것이 무엇을 위해 사용되는지 상상할 수 없습니다. 어떤 아이디어?


5
포인터로 붕괴하는 것과 관련이 있습니까?
Elazar

3
마지막 댓글이 완전히 틀린 것 같습니다 ...
R .. GitHub STOP HELPING ICE

답변:


116

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

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


12
또한를 통한 복사를 방지 =합니다.
melpomene

11
그건 더럽다. 최소 시간이 지나면이 답변을 수락하겠습니다. 당신의 도움을 주셔서 감사합니다!
알렉산더 - 분석 재개 모니카

3
@Alexander : 이런 식으로 캡슐화 할 때 그렇게 총체적이지는 않습니다 typedef. 예,이 임시 작업을 수행하는 것은 다소 끔찍하지만 API 사용자가 참조 대 비 참조 의미론에 대해 생각할 필요가없는 희미하게 불투명 한 유형 ( 항상 참조로 전달 되어야 함 )이있는 경우 합리적인 방법입니다. 그렇지 않으면 그것이없는 언어에 자동 참조 의미론을 추가하는 것. 사용자가 유형을 수신하는 자체 API를 작성하는 경우에도 작동합니다. C에서 배열을 인수로 허용한다고 선언하면 실제로 포인터를 허용한다는 의미이기 때문입니다. 모든 것이 "그냥 작동"합니다.
ShadowRanger 2017

4
@ShadowRanger 그것은 영리한 속임수이지만 ... otherwise lacks it그것에 대해 심한 것입니다. 해결 방법 자체가 아닌 C의 한계
Alexander-Monica 복원 2017

34
IMO 그것은 역겹습니다. GMP로 처음 작업했을 때 숫자가 가치로 전달 되었기 때문에 어떻게 작동하는지 이해할 수 없었습니다. 나는 그것을 이해하기 위해 GMP 헤더를 파헤쳐 야했다. 이미 C를 알고있는 사람들 앞에서 날아갑니다. 그런 다음 *코드에서 a 를 찾는 대신 값으로 전달되는 매개 변수와 참조 인 매개 변수 를 기억해야합니다.
MM
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.