5_MemLayout.cpp
#include <iostream>
#include <iomanip>
using namespace std;
#define MAX 25 // 1~ 분리 ~156~ 통합
int A=32767, B=-32767, C, D;
int X[4]={1000, 2000, 3000, 4000};
int Y[4];
int *P=&A, *Q=&X[0], *R, *S;
static int E, F, G, H;
int add(int *p)
{
int i, total=0, j=1, k=2;
cout<<"\n\n11. i, total, j, k 주소 :";
cout<<setw(12)<<&i<<setw(12)<<&total<<setw(12)<<&j<<setw(12)<<&k;
for (i=0; i<4; i++) total=total+*(p+i);
return (total);
}
void main( )
{
int a=999, b=888, c, d;
int x[4]={111, 222, 333, 444};
int y[4];
int *p=&a, *q=&x[0], *r, *s;
static int e, f, g, h;
R=(int *)calloc(MAX, sizeof(int));
S=(int *)malloc(MAX);
cout<<"\n 1. 전역 변수 A-D 주소 :";
cout<<setw(12)<<&A<<setw(12)<<&B<<setw(12)<<&C<<setw(12)<<&D;
cout<<"\n 2. 전역 배열 X[0-3]주소 :";
cout<<setw(12)<<&X[0]<<setw(12)<<&X[1]<<setw(12)<<&X[2]<<setw(12)<<&X[3];
cout<<"\n 3. 전역 배열 Y[0-3]주소 :";
cout<<setw(12)<<&Y[0]<<setw(12)<<&Y[1]<<setw(12)<<&Y[2]<<setw(12)<<&Y[3];
cout<<"\n 4. 전역 포인터 P-S 주소 :";
cout<<setw(12)<<&P<<setw(12)<<&Q<<setw(12)<<&R<<setw(12)<<&S;
cout<<"\n 4. 전역 포인터 P-S 값 :";
cout<<setw(12)<<P<<setw(12)<<Q<<setw(12)<<R<<setw(12)<<S;
cout<<"\n 5. 정적 변수 E-H 주소 :";
cout<<setw(12)<<&E<<setw(12)<<&F<<setw(12)<<&G<<setw(12)<<&H;
r=(int *)calloc(MAX, sizeof(int));
s=(int *)malloc(MAX);
cout<<"\n\n 6. 지역 변수 a-d 주소 :";
cout<<setw(12)<<&a<<setw(12)<<&b<<setw(12)<<&c<<setw(12)<<&d;
cout<<"\n 7. 지역 배열 x[0-3]주소 :";
cout<<setw(12)<<&x[0]<<setw(12)<<&x[1]<<setw(12)<<&x[2]<<setw(12)<<&x[3];
cout<<"\n 8. 지역 배열 y[0-3]주소 :";
cout<<setw(12)<<&y[0]<<setw(12)<<&y[1]<<setw(12)<<&y[2]<<setw(12)<<&y[3];
cout<<"\n 9. 지역 포인터 p-s 주소 :";
cout<<setw(12)<<&p<<setw(12)<<&q<<setw(12)<<&r<<setw(12)<<&s;
cout<<"\n 9. 지역 포인터 p-s 값 :";
cout<<setw(12)<<p<<setw(12)<<q<<setw(12)<<r<<setw(12)<<s;
cout<<"\n10. 정적 변수 e-h 주소 :";
cout<<setw(12)<<&e<<setw(12)<<&f<<setw(12)<<&g<<setw(12)<<&h;
add(x); cout<<endl<<endl;
cout<<"\n12. 동적 메모리할당 주소 값 : R S r s\n";
for (d=1; d<21; d++) {
R=(int *)calloc(MAX, sizeof(int));
S=(int *)calloc(MAX, sizeof(int));
r=(int *)malloc(MAX);
s=(int *)malloc(MAX);
cout<<setw(38)<<R<<setw(12)<<S<<setw(12)<<r<<setw(12)<<s<<endl;
// free(R); free(S); free(r); free(s);
}
}
프로그램 결과값
가. 사용된 변수들의 메모리 배치도 작성
a~d -> 12바이트 차이
배열간은 4바이트 차이
p~s 12바이트
I~k 12바이트 차이
BSS 세그먼트와 데이터 세그먼트 모두 4바이트 차이
나. 변수들의 성질에 따른 메모리내 배치 특성
+내부 변수 -> 스택
+외부 변수 초기화된 것 ->데이터 세그먼트
+외부 변수 비초기화된 것 ->BSS 세그먼트
다. R, S, r, s의 최종 값의 의미
R,S 는 calloc을 써줌으로 써 int의 공간만큼 미리 할당을 해준다
r,s 는 malloc을 써줌으로써 동적 할당을 해준다
중간에 값(d)이 달라지면 그에맞게 R,S,r,s 도 바뀐다
라. 강의록 제4장 33쪽의 메모리 배치도와 차이점
데이터 세그먼트와 BSS 세그먼트의 주소 순위가 바뀌었다