1. struct { char aa[10]; int bb; char cc[10]; } REQ_MSG; 2. int dd;
1번과 같은 구조체에서 sizeof(REQ_MSG) 출력하면 28이 나오는데 왜 그렇죠? 24 아닌가요?
2번과 같이 선언하고 sizeof(dd) 하면 4 가 나오거든요,,,,
허접질문이지만 고수님들의 답변 부탁드립니다....
'구조체 and 패딩' 정도로 검색해보세요.
---- Let's shut up and code.
4바이트 align때문에 char aa[10]과 char cc[10]뒤에 2바이트씩 padding이 들어가서 4바이트가 더 생기는거죠.
struct REQ_MSG msg; printf("the offset of bb = 0x%x",&msg.bb-&msg);
만일, gcc를 사용하신다면 아래 코드와 같이 해 보세요. 원하시는 것처럼 될거에요. 하지만, packed는 다른 컴파일러에서는 먹히지 않습니다.
struct { char aa[10]; int bb; char cc[10]; } REQ_MSG __attribute__ ((packed));
char aa[10] 과 char cc[10] 이 4byte alignment에 맞지 않기 때문에 2바이트씩 패딩됩니다. 따라서 24+2+2 = 28.
ps. 이것도 FAQ이지요... :-P
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
'구조체 and 패딩' 정도로 검색해보세요.
'구조체 and 패딩' 정도로 검색해보세요.
----
Let's shut up and code.
4바이트 align때문에 char aa[10]과 char cc[10]뒤에
4바이트 align때문에 char aa[10]과 char cc[10]뒤에 2바이트씩 padding이 들어가서 4바이트가 더 생기는거죠.
해 보세요. 0x0a이 출력되지 않고 0xc가 출력될거에요.
만일, gcc를 사용하신다면 아래 코드와 같이 해 보세요. 원하시는 것처럼 될거에요. 하지만, packed는 다른 컴파일러에서는 먹히지 않습니다.
char aa[10] 과 char cc[10] 이 4byte alignm
char aa[10] 과 char cc[10] 이 4byte alignment에 맞지 않기 때문에 2바이트씩 패딩됩니다. 따라서 24+2+2 = 28.
ps.
이것도 FAQ이지요... :-P
댓글 달기