2013-03-29 3 views
1
#include <stdio.h> 
#include <string.h> 
#include <malloc.h> 

struct Student { 
     char name[100]; 
     int id; 
     char major[50]; 
     char address[200]; 
}; 

int main() 
{ 

    struct Student st; 

    strcpy(st.name, "Chuck"); 
    st.id = 20001; 
    strcpy(st.major, "Computer Science"); 
    strcpy(st.address, "1st Street"); 

    printf("%d %d %d %d %d\n", sizeof(st), sizeof(st.name),sizeof(st.id), sizeof(st.major), sizeof(st.address)); 

    return 0; 
} 

출력은 356 100 4 50 200입니다. 왜 sizeof (st)가 356이 아닌 356입니까? 그리고 나는 int를 가지지 않고 이걸 시도해 보았고 결과는 350 100 50 200이므로 문제가 정수라고 가정합니다.sizeof in struct

+0

사용중인 컴파일러, 프로세서, 운영체제를 알려주지 않았습니다. –

+1

'size_t'를 출력하는 데'% d '을 사용하지 마십시오. 대신에'% zu'를 사용하십시오. – Sebivor

+1

@BasileStarynkevitch : 그건 중요하지 않습니다. 대답은 모든 플랫폼에서 동일합니다. –

답변

7

이것은 struct 회원 간의 패딩 때문입니다. 패딩은 각 데이터 멤버가 올바르게 aligned in memory인지 확인하는 데 필요합니다. 정확한 정렬 요구 사항은 아키텍처에 따라 다릅니다.

이 때문에 struct의 크기가 해당 구성원의 크기 합계라고 가정 할 수 없습니다.

+0

"특별한 경우에, int는 4 바이트 경계에서 정렬됩니다. 그 전에 2 바이트의 패딩이 필요합니다."- Nope; 100 % 4 == 0.정답은 구조체가 4 바이트의 배수로 정렬된다는 것입니다 (354 % 4 == 2). –

+0

@JimBalter : 당신이 옳습니다, 고마워요. – NPE

+0

부수적으로 이는 구조체 내부의 멤버 선언 순서가 크기에 영향을 줄 수 있음을 의미합니다. –

1

구조의 처음이 아닌 각 필드 앞에 간격 (또는 패딩)이 올 수 있습니다. 컴파일러는 프로세서 및 ABI 규칙의 필요성에 맞게 갭을 추가합니다.

컴파일러를 신뢰해야합니다. 구현시 필요에 따라 struct을 배치해야합니다.

일부 컴파일러는 구조의 레이아웃을 변경하거나 개선하기위한 확장을 제공합니다. GCC의 type attributesaligned 또는 packed입니다.

가 문제로 struct 내부의 패딩과 격차를 생각하지 말고 자산으로 ... 컴파일러 등 프로세서의 ABI 규칙을 만족시키기 위해 아주 열심히하려고

대부분의 컴파일러는하지 않습니다 구조체의 필드 재정렬 (GCC는 거의 사용하지 않는 유용한 최적화가 있었지만, 최적화가 제거 된 경우가 있었는데, 때로는 LTO로 인해 어려움을 겪었 기 때문).

크기가 약 struct 인 경우 필드의 순서가 마음에 들지 않으면 교묘하게 순서를 변경할 수 있습니다. 하지만 가장 밀집한 순서는 아키텍처에 따라 다를 수 있습니다.

BTW의 C 표준은 int이 012 비트의 크기보다 더 큰 크기와 정렬을 보장하지 않습니다 (매우 일반적 일지라도). char. 이를 위해 <stdint.h>int32_t을 제공합니다. int -s가 16 비트 인 16 비트 시스템 (예 : 1980 년대 인텔 8086 프로세서가있는 원래 PC AT 또는 저렴한 16 비트 마이크로 컨트롤러)을 사용하여 컴파일하는 경우 패딩 또는 간격을 관찰하지 않을 것으로 판단됩니다.

+0

"구조의 처음이 아닌 각 필드 앞에는 갭 (또는 패딩)이 올 수 있습니다."-이 경우 필드의 어느 것도 갭으로 시작하지 않습니다. 마지막 필드 다음에 갭이 생겨 구조체 크기를 4의 배수로 채 웁니다. –

관련 문제