이거..도저히 이해가 않 됩니다.

익명 사용자의 이미지

#include
#include

typedef struct _song
{
int a;
char b[5];
} t_song;

t_song *p_song;

void main(void)
{
t_song song;
printf("a size %d, b size %d\n", sizeof(p_song->a), sizeof
(p_song->b));
printf("total size is %d\n", sizeof(p_song));
printf("total size is %d\n", sizeof(t_song));
printf("a size %d, b size %d\n", sizeof(song.a), sizeof(song.b));
printf("total size is %d\n", sizeof(song));
}

************결과**************

a size 4, b size 5
total size is 4
total size is 12
a size 4, b size 5
total size is 12

희안하죠?

질문1)

p_song->a 이면 sizeof (int)이니 4byte..이해가 갑니다.
p_song->b 이면 sizeof (char) *5이니 5byte..이해가 갑니다.
그런데...sizeof(p_song)은 왜 5 + 4가 아닌 4가 나왔을까요?

만약 p_song의 사이즈는 address를 의미한다고 하실 분이 있다면
그럼 p_song->a와 p_song->b는 address가 아닌가요?

질문2)

sizeof(t_song)은 12(?)란 숫자가 나왔습니다.
sizeof(song.a), sizeof(song.b)는 각각 5, 4가 나왔습니다.
그럼 sizeof(song)은? 놀랍게도 12입니다.

song.a + song.b = song 맞죠?

그럼 5+4 = 12(???)입니까?

왜 struct의 구성원의 총합이 struct자체의 크기와 다를까요?
도대체 알수가 없습니다.

이에 대해 속시원히 대답해 주실 고수분이 계신다면 좋은 가르침
부탁드립니다.

익명 사용자의 이미지

김경태 wrote..
#include <fcntl.h>
#include <string.h>

typedef struct _song
{
int a;
char b[5];
} t_song;

t_song *p_song;

void main(void)
{
t_song song;
printf("a size %d, b size %d\n", sizeof(p_song- >a), sizeof
(p_song->b));
printf("total size is %d\n", sizeof(p_song));
printf("total size is %d\n", sizeof(t_song));
printf("a size %d, b size %d\n", sizeof(song.a), sizeof(song.b));
printf("total size is %d\n", sizeof(song));
}

************결과**************

a size 4, b size 5
total size is 4
total size is 12
a size 4, b size 5
total size is 12

희안하죠?

질문1)

p_song->a 이면 sizeof (int)이니 4byte..이해가 갑니다.
p_song->b 이면 sizeof (char) *5이니 5byte..이해가 갑니다.
그런데...sizeof(p_song)은 왜 5 + 4가 아닌 4가 나왔을까요?

만약 p_song의 사이즈는 address를 의미한다고 하실 분이 있다면
그럼 p_song->a와 p_song->b는 address가 아닌가요?

p_song 은 포인터이기에 4byte 입니다.^^

글구 p_song->a 는 이미 포인터로 참조한 데이타를 의미하기때문에..
각각에 맞는 데이타 형이 나오는겁니다..

질문2)

sizeof(t_song)은 12(?)란 숫자가 나왔습니다.
sizeof(song.a), sizeof(song.b)는 각각 5, 4가 나왔습니다.
그럼 sizeof(song)은? 놀랍게도 12입니다.

song.a + song.b = song 맞죠?

그럼 5+4 = 12(???)입니까?

왜 struct의 구성원의 총합이 struct자체의 크기와 다를까요?
도대체 알수가 없습니다.

이에 대해 속시원히 대답해 주실 고수분이 계신다면 좋은 가르침
부탁드립니다.

struct 의 사이즈는 메모리와 관련이 깊습니다....

9바이트가 나오더라도...실제로 구현될때..그것은 오버헤드가 걸리기때문
에..( 4바이트 단위로 처리되는게 좋음...)

컴파일러가....4바이트단위로 바인드되게 할당해줍니다.

그것을 강제로 설정할 수 있지만...--; 컴파일러가 해주는대로 하는게

좋겠죠?...

익명 사용자의 이미지

p_song 은 포인터이기에 4byte 입니다.^^

글구 p_song->a 는 이미 포인터로 참조한 데이타를 의미하기때문에..
각각에 맞는 데이타 형이 나오는겁니다..

--> 말씀하신대로 Pointer로만 선언되는 경우에는 malloc이 되더라도
그냥 포인터의 사이즈만 나오더군요.

그 포인터에서 연산을 거쳐 나오는 경우에는 그 내용의 싸이즈가 나오
구요...제가 잘못 이해 했던 모양입니다.

감사합니다.

struct 의 사이즈는 메모리와 관련이 깊습니다....

9바이트가 나오더라도...실제로 구현될때..그것은 오버헤드가 걸리기때문
에..( 4바이트 단위로 처리되는게 좋음...)

컴파일러가....4바이트단위로 바인드되게 할당해줍니다.

그것을 강제로 설정할 수 있지만...--; 컴파일러가 해주는대로 하는게

좋겠죠?...

--> 직접 해보니까 님이 말씀하신 결과 대로 더군요..한수 배웠습니다.
감사합니다.

익명 사용자의 이미지

항상 4바이트 단위는 아닙니다.
정확히 말하면

n바이트를 한번의 명령어로 쓰는데는, n의 배수에 해당하는
주소로 시작하는 메모리를 할당해야 합니다.

1바이트면 1의 배수니까 임의 주소가 가능하고
2바이트면 2의 배수 주소에,
4바이트면 4의 배수 주소에
double 처럼 8 바이트면 8배수 주소에 배치됩니다.
앞으로 더 좋은 CPU가 나오면, 16배수나 32배수도 있을 수
있겠죠.
그래서...

struct _xxx {
char a;
long b; /* sizeof(long)==4 인 시스템 */
};

b 를 4배수인 주소에 배치하기 위해 char a 다음에 3바이트를
덧대는 (padding ) 것입니다. 결과적으로 구조체 크기는
8바이트가 되죠.

이걸 제대로 처리하지 않으면 몇몇 시스템에서는 bus error가
납니다. 인텔 CPU 는 그렇지 않지만요. 어쨌든 위와같이 하면
메모리를 읽고 쓰는 효율이 증가되는 건 사실입니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.