구조체를 만들었는데
그 형식은 아래와 같다.
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바이트인 것을 알 수 있다.
즉, pragma pack(1) 안에 들어가는 숫자는 메모리공간을 1바이트씩 할당하는 것을 확인 할 수 있다.
통신데이터나 메모리할당을 받을때 중간에 메모리공간이 남아버리면 안되는 곳에서 문제가 될 것이기에 이와같이 할당해주면 좋을것이다!
'C++프로그래밍' 카테고리의 다른 글
[2013.11.01] C++ _ 자료형과 연산자 (0) | 2013.11.01 |
---|---|
2013.10.18_문자열변수와 문자열상수의 구분 (0) | 2013.10.18 |
2013.05.22_ARM칩 Library에서 끌어쓰기 (0) | 2013.05.22 |
2013.05.20_Timer/Counter_AIC__풀업풀다운. (0) | 2013.05.20 |
2013.05.15_배열포인트_cast,함수포인터. (0) | 2013.05.15 |