성엽이
KKIMSSI
성엽이
전체 방문자
오늘
어제
  • 분류 전체보기 (454)
    • :) (2)
    • C프로그래밍이론 (9)
    • C++프로그래밍 (64)
      • STL (1)
    • C# (2)
    • Visual studio 10.0 (9)
    • AT91SAM7S256 (21)
    • 논리회로 (14)
    • AVR2560 (11)
    • TCPIP (16)
    • NetWork (4)
      • Ubuntu Linux (2)
    • Assembly (21)
    • UNIX 프로그래밍 (6)
    • RFID 분석 (1)
    • Win32 API (7)
    • Cortex-M3 (4)
    • Unity (91)
    • Flutter (9)
    • OwnProject (11)
      • It's mine (5)
      • 마인드스톰 실습 (1)
      • 보고서 자료 (2)
      • RPi B+ (2)
    • ETC (25)
      • 상식 (3)
    • MFC (40)
    • PostgeSQL (18)
    • 영상제어 (6)
      • VFW_영상처리 (1)
    • Python (0)
    • Java (30)
      • SpringBoot (2)
      • Javascript (1)
      • JSP (13)
      • Spring (8)
    • Oracle (4)
      • SQL (3)
    • HTML (6)
      • Thymeleaf (1)
      • CSS (1)
      • Bootstrap (3)
    • IDE (1)
      • VS Code (1)
    • Android (2)
    • Privacy Policy (0)
    • MYSQL (2)
      • MariaDB (2)
    • AWS (5)
    • 개인공부 (0)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록
  • 관리자
  • 글쓰기

공지사항

인기 글

태그

  • WINAPI
  • Boot Code 분석
  • MFC
  • ARM Reverse Engineering
  • 문자열 나누기

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
성엽이

KKIMSSI

C++프로그래밍

2013.05.27_pragma pack() 에 대해서_팁

2013. 5. 27. 22:29

구조체를 만들었는데

그 형식은 아래와 같다.

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
    'C++프로그래밍' 카테고리의 다른 글
    • [2013.11.01] C++ _ 자료형과 연산자
    • 2013.10.18_문자열변수와 문자열상수의 구분
    • 2013.05.22_ARM칩 Library에서 끌어쓰기
    • 2013.05.20_Timer/Counter_AIC__풀업풀다운.
    성엽이
    성엽이

    티스토리툴바