2014-06-22 1 views
1

int, char 및 struct의 크기를 확인하는 코드를 작성했습니다. 그러나 수동으로 계산 한 것보다 다른 결과를 제공합니다. 다른 결과 SIZEOF 연산자를 사용하여 계산 된 것보다?

#include<stdio.h> 
struct person 
{ 
    int roll; 
    char name[10]; 

}; 
void main() 
{ 
    struct person p1; 
    printf("\n The size of the integer on machine is \t :: %d \n ",sizeof(int)); 
    printf("\n The size of the char on machine is \t :: %d \n ",sizeof(char)); 

    printf("\n The size of structre is \t :: %d \n",sizeof(struct person)); 
    printf("\n The size of structre is \t :: %d \n",sizeof(p1));  


} 

나는 구조가 있어야한다 생각의 크기 = 10 * 1 + 4 = 14 그러나 출력이 %zu sizeof 때문에 반환 size_t 유형 %d을 변경해야

The size of the integer on machine is :: 4 

The size of the char on machine is  :: 1 

The size of structre is  :: 16 
+2

http://stackoverflow.com/tags/c/info로 답변을 제공합니다. 그리고 10 * 1 + 4는 14, btw입니다. – mafso

+2

구조가 패딩되어 – bolov

답변

0

처음이다.

sizeof(p1)은 바이트가 추가 되었기 때문에 14 대신 16 바이트를 제공합니다.

struct person 
{ 
    int roll;  // 4 bytes 
    char name[10]; // 10 bytes. 2 bytes are needed for structure alignment 

}; 
+0

2 바이트가 패딩으로 추가되는 이유는 무엇입니까? – alpha9eek

+0

[구조체 정렬] (http://en.wikipedia.org/wiki/Data_structure_alignment)을 사용하면 CPU가 메모리를 처리하는 방식으로 인해 시스템 성능이 향상됩니다. – haccks

1

위키피디아의 의견보기!

모든 개체 유형의 크기를 계산하려면 컴파일러에서 효율성 또는 아키텍처 제약 조건을 충족시키는 데 필요한 주소 정렬을 고려해야합니다. 많은 컴퓨터 아키텍처는 워드 크기의 배수가 아닌 모든 바이트 주소에서 시작하는 다중 바이트 액세스를 지원하지 않으며 아키텍처에서 허용하는 경우에도 일반적으로 프로세서는 객체를 가져올 수있는 것보다 빠르게 단어 정렬 객체를 가져올 수 있습니다 그 기억에 여러 단어를 걸쳐있다. [4] 따라서 컴파일러는 일반적으로 데이터 구조를 적어도 단어 정렬 경계에 정렬하고 개별 구성원을 각각의 정렬 경계에 정렬합니다. 다음 예에서 구조 학생은 단어 경계에 정렬 될 가능성이 높습니다. 단어 경계는 구성원 등급이 시작되는 곳이기도하며 구성원 연령은 다음 단어 주소에서 시작될 가능성이 큽니다. 컴파일러는 필요에 따라 정렬 요구 사항을 충족하기 위해 멤버간에 사용되지 않은 "패딩"바이트를 삽입하여 후자를 수행합니다. 구조체가 배열 요소로 사용되는 경우 적절한 정렬을 보장하기 위해 구조체 끝에 패딩이있을 수도 있습니다. 따라서 C에서 구조체의 집계 크기는 개별 구성원의 크기 합계보다 클 수 있습니다. 예를 들어, 많은 시스템에서 다음 코드는 8 인쇄됩니다 :

struct student{ 
    char grade; /* char is 1 byte long */ 
    int age; /* int is 4 bytes long */ 
}; 

printf("%zu", sizeof (struct student)); 

당신은 예를 들어 이해

에 대한 귀하의 구조에서 char 배열의 크기를 변경하여 시도해야합니다 :

struct person 
{ 
    int roll; 
    char name[4]; 

}; 

답을 표시합니다. 8

struct person 
{ 
    int roll; 
    char name[7]; 

}; 

+0

정말 도움이된다면 대답을 받아 들일 수 있습니다! ;) – Nullpointer