본문으로 바로가기

rep5

category c++/대학 과제 2020. 5. 25. 07:49

 
 

과제 가이드

 
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 세그먼트의 주소 순위가 바뀌었다

강의록 제4장 33쪽 메모리 배치도

 

'c++ > 대학 과제' 카테고리의 다른 글

중간고사 실기  (0) 2020.05.25
rep6  (0) 2020.05.25
rep4  (0) 2020.05.25
rep3  (0) 2020.05.25
rep2  (0) 2020.05.25