메모리 주소에 관한 질문입니다.

amblance의 이미지

공부하다가 모르는 것이 있어서 질문드립니다.

#include <stdio.h>
 
int main(void)
{
  char a;
  short b;
  int c;
  long d;
  float e;
  double f;
  unsigned int g;
  unsigned short h;
 
  printf("a : %x\n", (int)&a);
  printf("b : %x\n", (int)&b);
  printf("c : %x\n", (int)&c);
  printf("d : %x\n", (int)&d);
  printf("e : %x\n", (int)&e);
  printf("f : %x\n", (int)&f);
  printf("g : %x\n", (int)&g);
  printf("h : %x\n", (int)&h);
 
  return 0;
}

다음과 같이 코드를 작성하였습니다.

그런데 결과를 확인하니,
bfd1633f
bfd1633c
bfd16334
bfd16330
bfd1632c
bfd16320
bfd16328
bfd1633a

다음과 같이 결과가 나왔습니다. 처음에 char의 첫 주소값이 bfd1633f인데 그다음 short의 첫 주소값이 bfd1633e가 나와야 하는것 아닌가요?
4byte로 메모리가 잡히는것 같은데... 너무 궁금합니다.

우분투에서 실행해보았습니다.

jick의 이미지

short는 2바이트니까, b의 주소값이 bfd1633e가 나오면 bfd1633e, bfd1633f 두 바이트를 쓸 테니 a가 사용하는 번지를 덮어쓰겠죠.

그리고 자동변수가 스택에 잡히는 상대적 위치는 순전히 컴파일러 맘대로이니까 별로 큰 의미를 두시지 않는 게 좋습니다. 컴파일러 버전만 달라져도 값이 바뀔 수 있습니다.

amblance의 이미지

bfd1633f[char]

bfd1633c[short]

bfd16334[int]

bfd16330[long]

---->

bfd1633f[char]

bfd1633e[short]

bfd1633c[int]

bfd16339[long]

이런식으로 차례대로 쌓이는것 아닌가요? 덮어쓴다는것이 무슨말씀이신지 이해가 잘 안됩니다.
바쁘실텐데 죄송합니다.

B(Birth) C(Choice) D(Death)
인생은 주어지는 것이 아니고 선택하는 대로 되는 것이다.

imokj의 이미지

만약 주소값이 높은쪽에서 낮은 쪽으로 변수가 빈틈없이 싸인다고 "가정"하면 아래처럼 쌓여야겠죠.

1바이트 char변수가 bfd1633f
2바이트 short가 bfd1633d~bfd1633e
4바이트 int가 bfd16339~bfd1633c

low <= (1234)(12)(1) =>high

말씀하신대로 bfd1633e에 short가 와버리면 bfd1633f까지도 short가 차지해야하니 char가 가지고 있던 bfd1633f와 겹쳐버리게 되니 말이 맞지 않겠죠?

게다가 실제 변수가 "빈틈없이" "순서대로" 메모리상에 쌓이지도 않을거에요.

댓글 달기

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