전역변수
어디서든 접근이 가능한 변수
전역변수와 지역변수의 이름을 달리하는 것이 좋다.
전역변수 아래와 같이 선언했을 때, 만들어진 파일의 용량이 엄청 커진다.
int A[1024*1024]={1, };
전역변수의 선언은 신중해야 한다.
프로그램이 복잡해지고 크기가 증가한다.
int A;
전역변수 A의 값은 0
지역변수에 static 선언하면?
: 전역변수의 성격을 지니게 됨
처음 1회만 초기화, 프로그램 종료시까지 메모리 상주(전역변수의 특성)
선언된 함수내에서만 접근 가능(지역변수의 특성)
전역변수에 static 선언하면?
분할 컴파일시, 파일간에 접근 불가능 (개별화됨)
// main.c 소스
#include <stdio.h>
int a;
int main(void)
{
printf("main: A = %d \n", a);
test();
printf("main: A = %d \n", a);
return 0;
}
// test.c 소스
#include <stdio.h>
int a;
void test(void)
{
printf("test : a = %d \n",a);
a = 777;
printf("test : a = %d \n",a);
return;
}
test.c 소스 3행의 int a;에 static을 붙였을 때의 출력결과
비쥬얼 스튜디오 실습
위의 소스를 작성후 6행에 중단점 설정
주소를 고정하고 메모리의 값을 알기 위해 아래의 과정을 따라한다.
DYNAMIC BASE를 NO로 설정하면 주소가 고정된다.
디버그할 때 메모리의 내용보기
바로 위와 같이 설정하면 디버그시, 주소와 함께 메모리의 정보가 표시된다.
조사식에 &iNum을 넣으면 주소를 알 수 있고, 메모리란의 주소에 값을 넣으면 내용을 볼 수 있다.
iNum의 주소 0x 00 19 fe fc
메모리에 Little Endian 으로 fc fe 19 00 이 올라가있음을 볼 수 있다.
포인터 변수의 크기
32bit system : 포인터 변수의 크기가 4byte
64bit system : 포인터 변수의 크기가 8byte
어셈블리 코드에서 dword ptr은 4byte pointer,
word ptr은 2byte pointer를 가리킨다.
마찬가지로 포인터의 주소를 통해 값을 볼 수 있다.
메모리의 TEXT 부분에 현재 실행중인 명령을 담고 있는 것이 Instruction Pointer이다.
EIP는 IP가 16비트에서 32비트 시스템으로 오면서 Extended 된것으로, 디버그시 EIP 레지스터도 확인 가능하다.
포인터 주소(0x 0019 FEF8)를 따라가서 메모리에 든 값 51EB 851F를 10진수로 바꿔보면,
1,374,389,535라는 값이 나온다.
'Study > C' 카테고리의 다른 글
2016-04-06-업무일지_포인터 및 함수 (0) | 2016.04.06 |
---|---|
20160405_포인터와 배열 (0) | 2016.04.05 |
20160329_C기초, 디버깅 (0) | 2016.03.29 |
20160308_업무일지_그 밖의 기초 학습 (0) | 2016.03.08 |
20160307_업무일지_파일 입출력 (0) | 2016.03.07 |