[smart]이재우-20140324
2014. 03. 24 수업 및 과제
1 메모리 영역의 이해
-메모리의 영역 5종류
메모리 영역 | |
행위 영역 |
기억 영역 |
code 영역 =Ro 영역 =text 영역 |
Data(전역변수) BSS(전역변수) Heap(동적할당) Stack(지역변수) |
-메모리 영역의 설명
메모리의 영역 5종류 | ||
메모리 Name | 메모리 생성 | 메모리 저장 형태 |
Code(함수) =Ro 영역(Read only) =text 영역 |
1.Compile Time(컴파일시 만들어지며 실행파일(*.exe)의 용량에 포함) |
1.상수값
2.printf" "
|
Data(전역변수) |
1.Compile Time(컴파일시 만들어지며 실행파일(*.exe)의 용량에 포함) 2.프로 그램이 종료 할때 까지 남아 있음 3.전역변수가 많으면 실행파일( *.exe) 용량이 늘어남 4.자주쓰는 메모리는 전역 변수를 쓰는 것이 유리 |
1.전역변수 중 초기값 입력 메모리 |
BSS(전역변수) =Block startde by Symbol =Zi영역
|
1.자동 초기화 메모리 영역
2.Block startde by Symbol 3.initialize(초기화) 4.Zi(Zero initialize)영역 (0값으로 초기화 된 영역) | |
Heap(동적할당) |
||
Stack(지역변수) |
1.Rum Time 시 생성
2.자주쓰는 메모리를 Stack(지역변수)로 정의시 생성과 삭제를 반복하는 시간이 늘어 나므로 속도가 느려 짐 |
1.지역변수 2.point 주소 저장 3.배열의 상수 값
|
[예제]
#include <stdio.h>
void Add(int iVal); // iVal 지역 변수임
int iNum; // 전역변수는 기본 0으로 초기화됨
int iNum1=10; // 초기화 값을 준 것은 메모리 Data
int iNum2;
int iNum3=30;
int iNum4;
int iNum5=50;
int iNum6;
int iNum7=70;
int main()
{
printf("iNum:%d \n", iNum); // 전역변수 0으로 초기화
Add(3); //
printf("iNum:%d \n", iNum);
iNum++;
printf("iNum:%d \n", iNum);
printf("&iNum :%08X \n", &iNum);
printf("초기화&iNum1:%08X \n", &iNum1);
printf("&iNum2 :%08X \n", &iNum2);
printf("초기화&iNum3:%08X \n", &iNum3);
printf("&iNum4 :%08X \n", &iNum4);
printf("초기화&iNum5:%08X \n", &iNum5);
printf("&iNum6 :%08X \n", &iNum6);
printf("초기화&iNum7:%08X \n", &iNum7);
printf("---------------\n");
printf("&main :%08X \n", &main);
printf("&Add :%08X \n", &Add);
printf("&printf:%08X \n", &printf);
printf("문자 주소 :%08X \n", "Hello");
return 0;
}
void Add(int iVal)
{
iNum=iNum+iVal;
printf("&iVal:%08X \n", &iVal);
[결과]
2 Static 변수
-전역변수의 성격을 지니는 변수
-(지역변수 특성)선언된 함수 내에서만 접근이 가능.
-(전역변수 특성)딱 1회 초기화되고 프로그램 종료 시까지 메모리 공간에 존재
3 register 변수
-CPU 내에 존재하는 메모리
-연산속도가 빠르다.
-전역변수에는 register 변수를 선언 할 수 없다.
-선언을 힌트를 주는 것임:컴파일러가 합당하지 않다고 판단하면 레지스터에 할당 하지 않음
4 재귀 함수
-CPU 내에 존재하는 메모리
-연산속도가 빠르다.
-전역변수에는 register 변수를 선언 할 수 없다.
-선언을 힌트를 주는 것임:컴파일러가 합당하지 않다고 판단하면 레지스터에 할당 하지 않음
5 배열
[예제]
#include <stdio.h>
int main()
{
/*
int iNum1
=1;
int iNum2
=2;
int iNum3
=3;
int iNum4
=4;
int iNum5
=5;
int iNum6
=6;
int iNum7
=7;
int iNum8
=8;
int iNum9
=9;
printf("%d\n", iNum1);
printf("%d\n", iNum2);
printf("%d\n", iNum3);
printf("%d\n", iNum4);
printf("%d\n", iNum5);
printf("%d\n", iNum6);
printf("%d\n", iNum7);
printf("%d\n", iNum8);
printf("%d\n", iNum9);
*/
int iNum[9]; //
배열
선언으로
간단히
코딩
int iCnt;
for(iCnt=0; 9>iCnt ; ++iCnt)
iNum[iCnt]=iCnt;
for(iCnt=0; 9>iCnt ; ++iCnt)
printf("%d\n", iNum[iCnt]);
return 0;
}