다음 코드를 보자

#include<stdio.h>
struct Test2
{
	char c;
	int i;
	double d;
};

void main()
{
	Test2 t1;
	printf("%d", sizeof(t1));
}

char == 1byte , double = 8byte , int == 4byte 그래서 다 더해져서 13byte

그럼 출력이 13일까??

That’s 논노 그렇지 않다

Untitled

놀랍게도 16! 이는 구조체의 크기를 할당할때 , 구조체의 요소들 중 가장 큰 자료형의 크기를 기준으로 그 배수만큼 크기를 갖는다고 한다.

위 구조체 Test2 의 메모리 배치는 위와 같다

위 구조체 Test2 의 메모리 배치는 위와 같다

여기서 char 형 옆에 3 의 padding 공간이 있다. 그런데 왜 하필 c 옆일까??? 이는 또 하나의 규칙이 존재하는데 , 자료들을 배치할때 메모리의 주소 번지를 각 크기의 배수번째에 배치를 시킨다고 한다. 이는 다음의 struct 형 자료를 보고 이해를 해보자.

또 다른 코드를 보자

#include<stdio.h>
struct Test
{
	char c1;
	char c2;
	int tmp;
	char c3;
	char c4;
	
	double tmp3;
};

void main()
{
	Test t1;
	printf("%d", sizeof(t1));
}

char 형 4개 그리고 int 형 1개 그리고 double 1개 그럼 4 + 4 + 8 == 16 일 것 이다.

Untitled

노올랍게도 24!! 이는 위에서 설명했던 2번째 규칙때문이다.

Untitled

위와 같이 배치되는것이 아니다! int 형이 여기서 메모리의 시작으로 부터 2 만큼 떨어져있으므로 , 자신의 크기인 4의 배수에 위치해 있지 않게 되어서 이런식으로 배치시키지 않는다.

아마 이런식으로 배치가 되어 24의 결과가 나온것일 것이다.

아마 이런식으로 배치가 되어 24의 결과가 나온것일 것이다.

또또 다른 코드를 보자

#include<stdio.h>
struct Test
{
	char c1;
	char c2;
	char c3;
	char c4;
	int tmp;
	
	double tmp3;
};

void main()
{
	Test t1;
	printf("%d", sizeof(t1));
}

사실 이 코드를 위에 코드보다 먼저 설명했었어야 했는디; 자 다음과 같은 경우는 어떻게 될까? 위에서는 24 였는데 이번에는 배수의 크기만큼16이 나온다.