728x90

전역변수

 

어디서든 접근이 가능한 변수

전역변수와 지역변수의 이름을 달리하는 것이 좋다.

 



 

전역변수 아래와 같이 선언했을 때, 만들어진 파일의 용량이 엄청 커진다.

 

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

+ Recent posts