구조체를 만들었는데

그 형식은 아래와 같다.

 

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 

+ Recent posts