struct를 쓰고 읽는 것에 대해서

sungjin의 이미지

다음과 같은 코드가 있습니다.
ss.h

#include <stdio.h>
#include <stdlib.h>

struct foo {
    char    a;
    char    b;
    short   c;
    int     d;
};

xx.c

#include "ss.h"

main()
{
    struct foo *bar;
    bar->a = 0x0a;
    bar->b = 0x0c;
    bar->c = 25;
    bar->d = 1000;

    printf("a(0x0a)\t %p %d\n", &bar->a, bar->a);
    printf("b(0x0c)\t %p %d\n", &bar->b, bar->b);
    printf("c(0025)\t %p %d\n", &bar->c, bar->c);
    printf("d(1000)\t %p %d\n", &bar->d, bar->d);
}

yy.c
#include "ss.h"

#define ADDR    0x80496b8

main()
{
    struct foo *bar;
    bar = (struct foo *)ADDR;
    printf("%p %d\n", &bar->a, bar->a);
    printf("%p %d\n", &bar->b, bar->b);
    printf("%p %d\n", &bar->c, bar->c);
    printf("%p %d\n", &bar->d, bar->d);
}

yy.c 에서 ADDR은 xx를 실행시킨후 얻어진 어드레스를 집어넣었습니다.
위와 같은 코드를 실행시켜보면..
Quote:

[root@sungjin test]# ./xx
a(0x0a) 0x80496b8 10
b(0x0c) 0x80496b9 12
c(0025) 0x80496ba 25
d(1000) 0x80496bc 1000
[root@sungjin test]# ./yy
0x80496b8 0
0x80496b9 0
0x80496ba 0
0x80496bc 0

위와 같이 됩니다.
제가 예상하기로는 구조체에 해당하는 값 a = 10, b =12, c =25, d =1000을 읽어와야 할것 같은데.
무슨 문제 인지..

답변 좀 부탁드립니다.

febace의 이미지

물론 틀릴수 있지만.
.xx를 실행 하고 나서
.yy를 실행 하시면

다른 프로세스로 진행하게 되면서 전혀 다른 영역으로 가게 됩니다.
메모리 주소는 같아 보이지만, 결국은 다른 주소 입니다.

하려고 하셨던 작업을 위해서는

yy.c를 xx.c뒤에 붙여서 실행해보시면 될것입니다.

errai의 이미지

한 프로세스에서 사용하는 메모리영역은 프로세스가 종료되면서
대부분 사라집니다. 특히 stack 영역은 당연히 사라지겠지요.
즉 어떤 프로세스에서 특정 주소영역에 어떤 데이터가 있다고 해도
프로세스가 종료되면서 사라집니다. 당연한 결과라고 생각됩니다.

그런데 위의 소스에서 아주 큰 오류를 범했네요.
struct foo *bar; 라는 포인터만 잡아놓고 메모리 영역을 만들어주지
않았네요. 변수가 하나라서 동작했을지 모르겠지만 아마도 좀 더
복잡하게 사용하면 segment fault가 예상 됩니다. malloc을 실행
시켜 주세요 :-)

댓글 달기

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