printf(" a -> %x\n", &a); 결과가 가상주소?

wisdom7의 이미지

다음은 제가 나름대로 이것저것 참고하여 정리한 내용입니다.

<가상메모리 공간 구조>
(1) user 영역 (0x00000000 ~ 0xbfffffff) (3GByte)
1) Text segment (0x00000000 ~ 0x00002fff) (12KByte)
CPU에 의해 실행되는 머신 코드들이 있는 영역.Read Only
2) data segment (0x00003000 ~ 0x00004fff) (16KByte)
전역변수와 static 변수가 저장되는 영역.
- Initalized data segment
data segment 라 불리는 영역이며,
초기화된 외부 변수 static 변수등이 저장되는 영역입니다.
예) static int a = 1;
- Uninitalized data segment : bss segment 라고 불리며,
이 영역을 프로그램이 실행될때 0 이나 NULL Pointer로
초기화 됩니다.
예) static int a; (외부 변수나, static 변수중
초기화 되지 않은 변수들)
3) Heap & Stack (0x00005000 ~ 0xbfffffff) (3GB - 28KB)
- Heap (0x00005000 부터 시작됨. )
동적 메모리 할당을 할경우 이곳에 할당이 됨(malloc)
Heap 영역은 uninitialzed data 영역의 top 과 stack 영역의
bottom 부분에 위치합니다.
- Stack (0xbfffffff 부터 시작됨. 변수가 선언될때마다 주소 감소)
함수 안의 auto변수(함수내 지역변수) 등이 저장되는 곳.
함수가 실행되는 동안에만 존재하며 함수의 실행이 종료되면
그 변수들도 사라집니다.

(2) kernel 영역 (0xc0000000 ~ 0xffffffff)(1GB)

------------------------------------------------------------
#include<stdio.h>

static int a, b, c; //uninitial data영역 (bss 영역)

void main()
{
static int l, m, n; //uninitial data 영역(bss 영역)
static int p=0, q=0, r=0; // initial data 영역(data 영역)
int i, j, k; //stack 영역 (유일하게 주소가 감소)

//전역변수
printf("\n 전역변수 \n");
printf(" a -> %x\n", &a);
printf(" b -> %x\n", &b);
printf(" c -> %x\n", &c);

//static 변수 (uninitial)
printf("\n static 변수 (uninitial) \n");
printf(" l -> %x\n", &l);
printf(" m -> %x\n", &m);
printf(" n -> %x\n", &n);

//static 변수 (initial)
printf("\n static 변수 (initial) \n");
printf(" p -> %x\n", &p);
printf(" q -> %x\n", &q);
printf(" r -> %x\n", &r);

//지역변수
printf("\n 지역변수 \n");
printf(" i -> %x\n", &i);
printf(" j -> %x\n", &j);
printf(" k -> %x\n", &k);
}

/*
<결과값>
전역변수
a -> 4237d0
b -> 4237d4
c -> 4237d8

static 변수 (uninitial)
l -> 4237e0
m -> 4237cc
n -> 4237dc

static 변수 (initial)
p -> 4237e4
q -> 4237e8
r -> 4237ec

지역변수
i -> 12ff7c
j -> 12ff78
k -> 12ff74
*/

-------> 의문
1. 결과값에 나온 위의 주소가 가상주소일까요?
2. 가상주소라면 전역변수와 static변수는 0x00003000~0x00004fff 사이의 주소이어야 할텐데...
어떻게 된 것인지 알고싶습니다.
이런 것을 알려면 어떤 자료를 찾아봐야하나요...

pastime의 이미지

가상 주소가 맞는데요
data 영역이나 bss 영역의 위치는 그렇게 고정된 것이 아니고
실제 데이터의 크기에 따라 변합니다.

printf 에서 포인터를 출력할 때는 %p 를 사용하는게 더 좋지만
nm 으로 심볼의 주소와 타입를 쉽게 볼 수 있습니다.
더 자세한 내용은 링커와 로더 쪽 자료를 찾아보세요..

댓글 달기

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