struct를 쓰고 읽는 것에 대해서
글쓴이: sungjin / 작성시간: 수, 2003/02/05 - 10:05오전
다음과 같은 코드가 있습니다.
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을 읽어와야 할것 같은데.
무슨 문제 인지..
답변 좀 부탁드립니다.
Forums:
답변입니다.
물론 틀릴수 있지만.
.xx를 실행 하고 나서
.yy를 실행 하시면
다른 프로세스로 진행하게 되면서 전혀 다른 영역으로 가게 됩니다.
메모리 주소는 같아 보이지만, 결국은 다른 주소 입니다.
하려고 하셨던 작업을 위해서는
yy.c를 xx.c뒤에 붙여서 실행해보시면 될것입니다.
당연히 안됩니다..
한 프로세스에서 사용하는 메모리영역은 프로세스가 종료되면서
대부분 사라집니다. 특히 stack 영역은 당연히 사라지겠지요.
즉 어떤 프로세스에서 특정 주소영역에 어떤 데이터가 있다고 해도
프로세스가 종료되면서 사라집니다. 당연한 결과라고 생각됩니다.
그런데 위의 소스에서 아주 큰 오류를 범했네요.
struct foo *bar; 라는 포인터만 잡아놓고 메모리 영역을 만들어주지
않았네요. 변수가 하나라서 동작했을지 모르겠지만 아마도 좀 더
복잡하게 사용하면 segment fault가 예상 됩니다. malloc을 실행
시켜 주세요 :-)
댓글 달기