출처: https://blog.iroot.kr/341 [RootKR]
우리는 이제 구조체가 어떻게 선언되는지 압니다.
하지만 이 구조체가 어떻게 저장되는지는 아직 모르죠.
구조체가 어떻게 저장이 되는지 알게된다면 구조체를 사용할때
나타나는 컴파일 에러들 중 일부를 잡을 수 있을거라 생각합니다.
꼭 그런 이유가 아니더라도 알고있다면 좋겠죠?
1
2
3
4
5
6
|
typedef struct card{
int pips;
char suit;
} card;
card c1;
|
이런식으로 struct card 형 변수 C1이 선언 되었다고 합시다. 이때 우리는
1
2
3
4
|
sizeof(int) //4
sizeof(char) //1
sizeof(c1) //5??
|
이런 코드를 통해 각각의 크기를 알아 볼 수 있겠죠. 우리는 구조체의 크기가 알고 싶으니
sizeof(c1)을 통해 알아볼 수 있습니다. 5가 나왔나요?
정답은 아마도 8이 나왔을 겁니다. 왜 그런지 천천히 알아보겠습니다.(아마도인 이유도있습니다)
단순하게 생각해본다면 1 + 4 를 해서 위 그림과 같이 총 5바이트를 차지해야 할 것 같지만
"대부분"의 컴파일러에서 구조체는 그렇게 컴파일되지 않습니다.
구조체는 컴파일 될 때 (크기가 가장 큰 바이트의 수) * (변수의 개수)만큼 공간을 할당 받습니다.
위의 경우에는 sizeof(int) * 2 인 8바이트가 할당된 것이죠. 그리고 남는 공간은 패딩을 통해 채웁니다.
그럼 왜 패딩을 하는 걸까요? 이유는 단순합니다 컴퓨터가 멤버들의 값을 읽기 쉽게 하기 위해서죠 이에 관한 설명은
링크를 참조해 주시기 바랍니다! 혹시라도 잘못된 설명을 할까봐...
아무튼 우리는 구조체는 컴파일할때 패딩비트가 생성된다는것도 알았고, 이를 통해 구조체가 컴파일 됬을 때 크기가 어떻게 설정되는지도 알았습니다... 사실 이 글을 포스팅하게된 계기가 있는데 중요한건 구조체를 컴파일하려면
멤버들의 크기를 모두 알아야한다!
입니다.
unix파일구조, inode, 심볼릭링크(소프트링크), 하드링크 (0) | 2020.09.24 |
---|---|
[C] 문자열 배열 초기화 (0) | 2020.03.01 |
[C] 연산자와 결합법칙,우선순위 (0) | 2020.03.01 |
[C]구조체 안에서 정의되지 않은 구조체를 쓰려면? (1) | 2020.02.29 |
[C] C언어에서 구조체 선언하기 (0) | 2020.02.28 |
댓글 영역