2017-11-23 3 views
-1

다음 프로그램에서 명명되지 않은 bitfield 멤버가 구조적으로 선언되었습니다. 프로그램의 인쇄 위크기가 지정되지 않은 bitfield 구성원 구조체의 크기가 1 인 이유는 무엇입니까?

#include <stdio.h> 

struct st{ 
    int : 1; 
}; 

int main() 
{ 
    struct st s; 
    printf("%zu\n",sizeof(s)); // print 1 
} 

출력 1.

이유는 무엇입니까 sizeof(s) 인쇄 1?

+2

무엇을 인쇄 하시겠습니까? –

+2

크기가 1 바이트이므로 추측 할 수 있습니다.) – Jerfov2

+0

나는 놀랍습니다. 1이 UB 여야합니다. 확인하려면 플랫폼에서 sizeof (int)는 무엇입니까? – Bathsheba

답변

4

구조에 다른 명명 된 구성원이 없기 때문에 sizeof(s)undefined입니다.

C11 6.7.2.1 (P8) :

구조체 또는 노조 지정자의 구조체 선언 목록의 존재는 새로운 유형의, 번역 단위 내에서 를 선언합니다. struct-declaration-list는 구조체 또는 공용체의 멤버 인 에 대한 선언 시퀀스입니다. struct-declaration-list에 명명 된 멤버가없고 익명 구조체가없고 익명 공용체가없는 경우 동작은 정의되지 않습니다. 형식은 목록을 종료하는} 직후까지 완료되지 않으며 그 후에는 을 완료하십시오.

당신은 다음과 같이 작성하는 경우 : 구조에서 명명 된 비트 필드 멤버가 있기 때문에

struct st{ 
     int : 1; 
     int i : 5; 
    }; 

그래서, sizeof(s)이 괜찮습니다.

+0

sizeof (st)는 struct 선언에서 UB가 될 것입니다. –

+0

비록 그것이 UB 일지라도 컴파일러가 당당한 행동을한다는 ​​것입니다. 컴파일러는 어떤 것이 사양에 없기 때문에 나쁜 것을 할 필요가 없습니다 ... –

+3

@GradyPlayer'1'을 " 나쁜 "또는"좋은 "? 실제로 표준에 따르면 그것은 UB입니다. –

관련 문제