티스토리 뷰
정적변수(static)
: 정적으로 할당되는 변수이다.
정적변수의 특징
- 지역 변수와 전역 변수의 성질을 같이 가지고 있다.
- 지역 변수처럼 선언 된 함수 안에서만 사용이 가능하다.
- 전역 변수처럼 프로그램이 종료 될 때까지 메모리 공간에 존재하게 된다.
- 지역 변수와는 달리 해당 함수가 반환을 하더라도 소멸되지 않는다.
C 및 관련 언어에서는 정적 변수와 기타 개념들 모두 static 키워드가 사용된다.
정적 변수 예제
#include < stdio.h >
void increase()
{
int num1 = 0; // 변수 선언 및 값 초기화
printf("%d\n", num1); // 변수 num1의 값을 출력
num1++; // 변수의 값을 1씩 증가
}
int main()
{
increase(); // 0
increase(); // 0
increase(); // 0
increase(); // 0: 변수가 매번 생성되고 사라지므로 0 출력
return 0;
}
함수가 끝나면 num1의 값은 사라지기 때문에 실행 결과는 0 0 0 0이 된다.
하지만 정적 변수 static을 선언해주면
#
include < stdio.h >
void increase()
{
static int num1 = 0; // 정적 변수 선언 및 값 초기화
printf("%d\n", num1); // 정적 변수 num1의 값을 출력
num1++; // 정적 변수 num1의 값을 1 증가시킴
}
int main()
{
increase(); // 0
increase(); // 1
increase(); // 2
increase(); // 3: 정적 변수가 사라지지 않고 유지되므로 값이 계속 증가함
return 0;
}
이와 같이 함수가 종료되어도 메모리에 값이 저장 되어 실행결과가 1씩 증가되는 모습을 볼 수 있다.
외부변수(extern)
: 여러 개의 함수들이 하나의 데이터를 공유할 때 함수 바깥에 선언되었다면 어느곳에서라도 사용 가능한 전역 변수이다.
외부변수의 특징
- 함수 바깥 뿐 아니라 소스 A.c 와 B.c 등 소스에서 소스로 변수 데이터를 사용할 수 있다.
- 외부 변수는 선언되는 순간 메모리의 특정 영역에 저장되어 프로그램이 실행되는 동안 계속 해서 존재한다.
- 외부변수는 선언되는 순간 0으로 자동적으로 초기화 된다.
- 외부 변수는 주로 파일 간에 변수를 공유할 목적으로 이용된다.
외부 변수 예제
#
include < stdio.h >
int result;
void ex()
{
result = 5;
}
int main()
{
result = 10;
printf(“메인 함수 result 값: % d\ n”, result); // 결과 10
ex();
printf(“ex 함수 result 값: % d\ n”, result); // 결과 5
}
이렇게 함수 밖에 선언되었기 때문에 저 변수는 어떠한 함수에서든 사용이 가능하다.
레지스터변수(register)
: register 키워드를 변수 앞에 선언하고 실행하면 그 변수는 cpu에 접근이 가장 빠른 메 모리 공간에 저장이 된다.
레지스터변수의 특징
- register 키워드 사용은 항상 작동되지 않고 cpu의 판단에 의해 무시 될 수도 있다.
- register 키워드를 사용하면 사용하지 않은 것 보다 더 빠르게 처리가 된다.
- register 키워드가 필요한 부분에 컴파일러가 알아서 붙여준다.
- 컴퓨터의 사양 또는 메모리 용량 등에 따라 다르게 나타난다.
실수는 레지스터형 변수가 될 수 없다.
- 세 개 이상의 레지스터형 변수를 선언하면 최초 두 개 까지만 레지스터형이 되고 나머지는 지역변수가 된다.
register int a; // 레지스터형 변수 a선언
register double d; // 실수는 레지스터형 변수가 될 수 없음. 지역변수로 선언된다.
register a,b,c; // a,b만 레지스터형 변수가 되고 c는 지역변수가 된다.
레지스터형 변수를 사용하는 이유는 조금이라도 더 빠른 속도를 얻기 위해서이다. 대규모의 루프를 돌린다거나 할 때 루프 제어 변수를 레지스터형으로 선언하면 이 변수의 읽기 속도가 빨라지므로 전체 루프의 실행 속도가 빨라질 것이다.
register int i, j;
for (i=0;i<10000000;i++) {
for (j=0;j<1000;j++)
'programming > c, c++' 카테고리의 다른 글
[C언어]전처리기의 특징, 헤더 파일 (0) | 2017.12.16 |
---|---|
[C언어 프로젝트]효민타자연습기 (0) | 2017.12.15 |
프로그래밍에 대한 기초적인 개념 (0) | 2017.12.15 |
[C언어] 포인터 장단점, 포인터와 배열의 차이 (0) | 2017.12.14 |
[C언어] 재귀 함수(함수의 재귀적 호출)란? , 피보나치, 팩토리얼 수열 (0) | 2017.12.14 |
- srop
- fsop
- hacking
- pwnable.tw
- overflow
- exit
- pwable
- rt_sigreturn
- 본선가고싶다
- 해킹
- oob
- glibc
- pwnable
- TLS
- shellcoding
- tcache
- HackCTF
- fastbindup
- fastbin
- stack reusing
- codegate
- SQLi
- heap
- ebp change
- FSB
- Total
- Today
- Yesterday