c언어에서 구조체 멤버들은 시스템스택에 따로 잡히나요??

이상민@Naver의 이미지

학교에서 공부 안하다가 군대와서 프로그래밍 공부를 다시 하고 있는데 문득 궁금한게 생겼네요.

전역변수나 지역변수, 함수등을 호출하면 시스템 스택에 저장되었다가 끝나면 pop된다고 알고 있는데

궁금한점은 만약에 구조체를 선언한다고 하면 구조체에 같이 있는 멤버들은 시스템 스택에 추가 될때 따로

스택에 들어가게 되나요 아니면 한꺼번에 같이 들어가게 되나요.

typedef example{
int a;
char b;
char c[10];
}
 
typedef example test;

이렇게 된다면 스택에는 test하고 멤버들인 a, b, c이렇게 들어가나요 아니면 test만 들어가나요?
알려주시면 감사하겠습니다ㅠㅠ..
라스코니의 이미지

함수를 호출할 때 그 호출 정보나 함수내의 지역변수는 스택에 저장되고 로드됩니다.
그 외에는 스택과 다른 곳(.DATA, .BSS 등)에서 처리됩니다.

따라서 test가 함수내에서 선언되면(지역변수) 스택에 잡히고, 전역변수로 선언되면 .DATA, .BSS 영역에 잡힙니다.

궁금한점은 만약에 구조체를 선언한다고 하면 구조체에 같이 있는 멤버들은 시스템 스택에 추가 될때 따로 스택에 들어가게 되나요 아니면 한꺼번에 같이 들어가게 되나요.

위 부분이 좀 이해가 안되지만 test가 스택에 들어간다면 한꺼번에 들어갑니다.

Stephen Kyoungwon Kim@Google의 이미지

이 질문을 하셨는지 모르겠는데 구조체가 크다고 (저처럼) 생각하셨나 보죠. 제 컴퓨터 한 3년 전쯤에 제가 한국 도착하자마자 샀는데, 본체 가격이 60만원이 안 됐습니다. 제 인생 최초로 외장 그래픽 카드도 달았고요. 그럼에도 램 크기는 12기가 바이트입니다.

그리고 정말 큰 구조체는 프로그래머가 뭘하든 컴파일러가 쪼개서 쓰는 멤버만 메모리에 넣습니다. 이제 프로그래밍을 시작하시는 단계라면, 그런 이슈는 크게 신경쓰지 마세요.

물론 물밑에서 어떤 일이 벌어지는지 이해하는 건 좋다고 생각합니다만, 그건 상대적으로 나중 일이고 코드 한 줄 한 줄 짜면서 이게 최적인지 아닌지 생각하시는 건 별로 바람직한 일은 아닐 것 같습니다.

Yi Soo An@Google의 이미지

메모리에 아래와 같이 정렬되고 test는 따로 잡히지 않습니다. 따라서 아래 코드를 실행하면 a, b 값을 가져와 바로 사용 가능합니다.

|a |b|c  |...|...|
 ^
test의 시작

int ta = test.a // a 값
int ta = *((int *)&test) // a 값
 
char tb = test.b // b 값
char tb = *(((char *)&test) + sizeof(test.a)) // b 값

---------------
Happy Hacking!

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.