구조체를 만들었는데
그 형식은 아래와 같다.
typedef struct _TEST_STRUCT
{
char CharValue;
char CahrValue2;
int IntValue;
char* pCharValue;
int* pIntValue;
} TEST_STRUCT, *PTEST_STRUCT;
여기서 살펴볼 것은
위와 같이 1바이트 짜리 변수, 4바이트 짜리 변수가 같이 묶여서 표현되어야 할 때
메모리 구성 방법이다.
위의 그림에서 0x0012FF70번지의 값이 0x0A라고 되어 있는 걸 보면
TestStruct.CharValue 임을 알 수 있다. char 형이 1바이트 이므로 제대로 들어갔다.
그렇다면
0x0012FF71 번지는 0x14. 이것은 TestStruct.CharValue2 이므로 이것도 제대로~
문제는
TestStruct.IntValue 값이 왜 0x0012FF74 번지에 들어갔느냐 하는 것이다.
예상대로 라면 0x0012FF72 번지에 값이 들어가 있어야 하는데....
추리해 보자면
vc 는 메모리에 변수를 할당할 때 4바이트를 기준으로 할당하는 것 같다.
그런데 프로그래머가 1바이트짜리 변수를 메모리에 할당하려 했다면
나머지 3바이트가 남아버리는 것이다.
이렇게 되면...
sizeof() 로 TestStruct 구조체의 크기를 알아볼 때 문제가 생긴다.
분명 TestStruct의 크기는 14바이트 이다.
하지만 이런 식이라면 16바이트로 나오게 된다.
이런 문제를 해결하려면 #pragma pack(1) 이런 걸 사용해야 한다.
#pragma pack(1)
typedef struct _TEST_STRUCT
{
char CharValue;
char CahrValue2;
int IntValue;
char* pCharValue;
int* pIntValue;
} TEST_STRUCT, *PTEST_STRUCT;
#pragma pack()
이렇게 하면 메모리가 어떻게 할당되는지 보자!!!
위 그림을 보면
TestStruct 구조체의 크기가 0x0012FF70 ~ 0x0012FF7D 까지 14바이트인 것을 알 수 있다.
펌)http://blog.naver.com/cshmax?Redirect=Log&logNo=52000375
[출처] #pragma pack(1) 에 대해서..|작성자 조성훈
'Language > C Programming' 카테고리의 다른 글
C Programming :: Queue (0) | 2014.03.17 |
---|---|
C Programming :: splint 함수 (0) | 2012.04.17 |
C programming :: 키 채터링 방지 키 체크 함수 (0) | 2011.12.19 |
C programming :: 전처리기 매크로 치환 (0) | 2011.12.19 |
C programming :: Quick Sorting (0) | 2011.12.19 |