목차
- 1 변수 관련 주요 현상과 주의점
- 2 변수 이해를 통한 C언어 마스터하기
- 3 변수의 저장 위치 실험과 확인
- 4 변수 관련 주요 현상과 주의점
- 5 변수 이해를 통한 C언어 마스터하기
- 6 변수의 저장 위치 실험과 확인
- 7 변수 관련 주요 현상과 주의점
- 8 변수 이해를 통한 C언어 마스터하기
- 9 변수의 저장 위치 실험과 확인
- 10 변수 관련 주요 현상과 주의점
- 11 변수 이해를 통한 C언어 마스터하기
- 12 변수가 저장되는 메모리의 네 가지 영역
- 13 변수의 저장 위치 실험과 확인
- 14 변수 관련 주요 현상과 주의점
- 15 변수 이해를 통한 C언어 마스터하기
- 16 변수가 저장되는 메모리의 네 가지 영역
- 17 변수의 저장 위치 실험과 확인
- 18 변수 관련 주요 현상과 주의점
- 19 변수 이해를 통한 C언어 마스터하기
- 20 변수의 기본 개념과 자료형
- 21 변수가 저장되는 메모리의 네 가지 영역
- 22 변수의 저장 위치 실험과 확인
- 23 변수 관련 주요 현상과 주의점
- 24 변수 이해를 통한 C언어 마스터하기
- 25 변수의 기본 개념과 자료형
- 26 변수가 저장되는 메모리의 네 가지 영역
- 27 변수의 저장 위치 실험과 확인
- 28 변수 관련 주요 현상과 주의점
- 29 변수 이해를 통한 C언어 마스터하기
전역 변수 vs 지역 변수 vs 상수
전역 변수는 프로그램 시작 시 데이터 영역에 고정된 주소로 할당됩니다. 따라서 함수 어디에서 접근하더라도 항상 동일한 메모리 주소를 가집니다. 반면, 함수 내부의 지역 변수는 스택 영역에 할당됩니다. 같은 함수를 여러 번 호출하거나 다른 함수에서 비슷한 지역 변수를 선언하면 매번 다른 주소에 생성될 수 있습니다. 이는 스택의 동작 방식 때문입니다.
상수 데이터는 코드 영역이나 ROM(Read Only Memory)에 저장됩니다. 예를 들어, 문자열 상수 “Hello World”나 const로 선언된 변수는 실행 중 변경될 수 없도록 읽기 전용 영역에 배치되어 예기치 못한 수정을 방지합니다.

위 다이어그램은 C 프로그램의 전형적인 메모리 레이아웃을 보여줍니다. 코드와 상수가 가장 낮은 주소에, 그 위로 데이터 영역, 힙 영역이 자라고, 스택 영역은 높은 주소에서 아래로 자라는 모습을 확인할 수 있습니다.
CPU와 변수의 관계
변수가 메모리에 저장되었다고 해서 CPU가 직접 메모리에서 데이터를 읽어 연산하는 것은 아닙니다. 현대 CPU, 특히 ARM과 같은 RISC 계열 프로세서는 레지스터라는 극히 빠른 소규모 메모리를 내장하고 있습니다. CPU의 연산 장치(ALU)는 이 레지스터에 있는 데이터만을 직접 처리할 수 있습니다. 따라서 메모리(RAM)에 있는 변수의 값을 계산에 사용하려면 반드시 그 값을 레지스터로 불러온(LOAD) 후에야 연산이 가능합니다. 컴파일러는 자주 사용되는 지역 변수를 최적화 과정에서 레지스터에 할당하기도 하여 프로그램의 실행 속도를 높입니다.
변수 관련 주요 현상과 주의점
오버플로우와 언더플로우
각 자료형은 저장할 수 있는 값의 범위가 정해져 있습니다. 예를 들어, 2바이트(16비트) 크기의 부호 있는 정수(signed short)는 -32768에서 32767까지 저장할 수 있습니다. 이 범위를 벗어나는 값, 예를 들어 32767에 1을 더하면 32768이 아닌 -32768이 됩니다. 이 현상을 오버플로우라고 합니다. 반대로 -32768에서 1을 빼면 32767이 되는 것을 언더플로우라고 합니다. 이는 메모리가 가진 비트의 표현 한계 때문에 발생하는 순환 현상으로, 예상치 못한 프로그램 오류의 원인이 될 수 있습니다.
실수형의 정밀도 오차
실수형 변수(float, double)는 소수점을 표현하기 위해 부동소수점 방식을 사용합니다. 이 방식은 넓은 범위의 수를 표현할 수 있는 대신 정밀도에 한계가 있습니다. float 형은 대략 소수점 이하 6자리까지, double 형은 약 15자리까지 정확하게 표현할 수 있습니다. 그 이상의 자리수에서는 반올림 오차가 발생할 수 있어, 금융 계산이나 정밀한 과학 계산에는 특별한 주의가 필요합니다.
변수 이해를 통한 C언어 마스터하기
변수는 단순한 데이터 보관함을 넘어, 프로그램과 컴퓨터 하드웨어(메모리, CPU)를 연결하는 핵심 다리 역할을 합니다. 변수의 자료형을 이해하면 데이터의 형태와 크기를 알 수 있고, 변수의 저장 영역을 이해하면 그 변수가 언제 생겨나고 사라지는지, 어디서 접근 가능한지 알 수 있습니다. 이는 메모리 누수, 스택 오버플로우, 예상치 못한 변수 값 변경 등 다양한 문제를 디버깅하는 데 필수적인 기초 지식이 됩니다. 특히 임베디드 시스템처럼 메모리 자원이 제한된 환경에서 프로그래밍할 때는 변수 하나의 선언과 사용에도 이러한 배경 지식이 큰 차이를 만듭니다. 변수에 대한 깊은 이해는 C언어라는 강력한 도구를 자유자재로 다루는 첫걸음이자 가장 튼튼한 기반이 될 것입니다.
변수의 저장 위치 실험과 확인
이론으로만 이해하기보다 실제 메모리 주소를 확인하면 훨씬 명확해집니다. 임베디드 개발 환경(Keil, IAR 등)이나 데스크탑 C 컴파일러의 디버거 기능을 사용하면 변수의 주소를 직접 볼 수 있습니다.
전역 변수 vs 지역 변수 vs 상수
전역 변수는 프로그램 시작 시 데이터 영역에 고정된 주소로 할당됩니다. 따라서 함수 어디에서 접근하더라도 항상 동일한 메모리 주소를 가집니다. 반면, 함수 내부의 지역 변수는 스택 영역에 할당됩니다. 같은 함수를 여러 번 호출하거나 다른 함수에서 비슷한 지역 변수를 선언하면 매번 다른 주소에 생성될 수 있습니다. 이는 스택의 동작 방식 때문입니다.
상수 데이터는 코드 영역이나 ROM(Read Only Memory)에 저장됩니다. 예를 들어, 문자열 상수 “Hello World”나 const로 선언된 변수는 실행 중 변경될 수 없도록 읽기 전용 영역에 배치되어 예기치 못한 수정을 방지합니다.

위 다이어그램은 C 프로그램의 전형적인 메모리 레이아웃을 보여줍니다. 코드와 상수가 가장 낮은 주소에, 그 위로 데이터 영역, 힙 영역이 자라고, 스택 영역은 높은 주소에서 아래로 자라는 모습을 확인할 수 있습니다.
CPU와 변수의 관계
변수가 메모리에 저장되었다고 해서 CPU가 직접 메모리에서 데이터를 읽어 연산하는 것은 아닙니다. 현대 CPU, 특히 ARM과 같은 RISC 계열 프로세서는 레지스터라는 극히 빠른 소규모 메모리를 내장하고 있습니다. CPU의 연산 장치(ALU)는 이 레지스터에 있는 데이터만을 직접 처리할 수 있습니다. 따라서 메모리(RAM)에 있는 변수의 값을 계산에 사용하려면 반드시 그 값을 레지스터로 불러온(LOAD) 후에야 연산이 가능합니다. 컴파일러는 자주 사용되는 지역 변수를 최적화 과정에서 레지스터에 할당하기도 하여 프로그램의 실행 속도를 높입니다.
변수 관련 주요 현상과 주의점
오버플로우와 언더플로우
각 자료형은 저장할 수 있는 값의 범위가 정해져 있습니다. 예를 들어, 2바이트(16비트) 크기의 부호 있는 정수(signed short)는 -32768에서 32767까지 저장할 수 있습니다. 이 범위를 벗어나는 값, 예를 들어 32767에 1을 더하면 32768이 아닌 -32768이 됩니다. 이 현상을 오버플로우라고 합니다. 반대로 -32768에서 1을 빼면 32767이 되는 것을 언더플로우라고 합니다. 이는 메모리가 가진 비트의 표현 한계 때문에 발생하는 순환 현상으로, 예상치 못한 프로그램 오류의 원인이 될 수 있습니다.
실수형의 정밀도 오차
실수형 변수(float, double)는 소수점을 표현하기 위해 부동소수점 방식을 사용합니다. 이 방식은 넓은 범위의 수를 표현할 수 있는 대신 정밀도에 한계가 있습니다. float 형은 대략 소수점 이하 6자리까지, double 형은 약 15자리까지 정확하게 표현할 수 있습니다. 그 이상의 자리수에서는 반올림 오차가 발생할 수 있어, 금융 계산이나 정밀한 과학 계산에는 특별한 주의가 필요합니다.
변수 이해를 통한 C언어 마스터하기
변수는 단순한 데이터 보관함을 넘어, 프로그램과 컴퓨터 하드웨어(메모리, CPU)를 연결하는 핵심 다리 역할을 합니다. 변수의 자료형을 이해하면 데이터의 형태와 크기를 알 수 있고, 변수의 저장 영역을 이해하면 그 변수가 언제 생겨나고 사라지는지, 어디서 접근 가능한지 알 수 있습니다. 이는 메모리 누수, 스택 오버플로우, 예상치 못한 변수 값 변경 등 다양한 문제를 디버깅하는 데 필수적인 기초 지식이 됩니다. 특히 임베디드 시스템처럼 메모리 자원이 제한된 환경에서 프로그래밍할 때는 변수 하나의 선언과 사용에도 이러한 배경 지식이 큰 차이를 만듭니다. 변수에 대한 깊은 이해는 C언어라는 강력한 도구를 자유자재로 다루는 첫걸음이자 가장 튼튼한 기반이 될 것입니다.
스택 영역과 힙 영역
스택 영역은 함수 내에서 선언된 지역 변수, 매개변수, 함수의 반환 주소 등이 저장됩니다. 이 영역은 ‘후입선출’ 방식으로 동작합니다. 함수가 호출되면 해당 함수의 정보를 담은 ‘스택 프레임’이 스택에 쌓이고, 함수가 종료되면 이 프레임이 제거되면서 지역 변수도 자동으로 소멸합니다. 따라서 함수 밖에서는 지역 변수에 접근할 수 없습니다.
힙 영역은 개발자가 프로그램 실행 중에 동적으로 메모리를 할당받아 사용하는 공간입니다. ‘malloc()’이나 ‘calloc()’ 함수를 통해 할당받으며, 사용이 끝나면 반드시 ‘free()’ 함수로 해제해야 합니다. 해제하지 않으면 메모리 누수가 발생합니다. 스택 영역은 주소가 높은 곳에서 낮은 곳으로 자라지만, 힙 영역은 그 반대 방향으로 자라며, 이 두 영역이 서로 만나면 ‘스택 오버플로우’ 오류가 발생합니다.
변수의 저장 위치 실험과 확인
이론으로만 이해하기보다 실제 메모리 주소를 확인하면 훨씬 명확해집니다. 임베디드 개발 환경(Keil, IAR 등)이나 데스크탑 C 컴파일러의 디버거 기능을 사용하면 변수의 주소를 직접 볼 수 있습니다.
전역 변수 vs 지역 변수 vs 상수
전역 변수는 프로그램 시작 시 데이터 영역에 고정된 주소로 할당됩니다. 따라서 함수 어디에서 접근하더라도 항상 동일한 메모리 주소를 가집니다. 반면, 함수 내부의 지역 변수는 스택 영역에 할당됩니다. 같은 함수를 여러 번 호출하거나 다른 함수에서 비슷한 지역 변수를 선언하면 매번 다른 주소에 생성될 수 있습니다. 이는 스택의 동작 방식 때문입니다.
상수 데이터는 코드 영역이나 ROM(Read Only Memory)에 저장됩니다. 예를 들어, 문자열 상수 “Hello World”나 const로 선언된 변수는 실행 중 변경될 수 없도록 읽기 전용 영역에 배치되어 예기치 못한 수정을 방지합니다.

위 다이어그램은 C 프로그램의 전형적인 메모리 레이아웃을 보여줍니다. 코드와 상수가 가장 낮은 주소에, 그 위로 데이터 영역, 힙 영역이 자라고, 스택 영역은 높은 주소에서 아래로 자라는 모습을 확인할 수 있습니다.
CPU와 변수의 관계
변수가 메모리에 저장되었다고 해서 CPU가 직접 메모리에서 데이터를 읽어 연산하는 것은 아닙니다. 현대 CPU, 특히 ARM과 같은 RISC 계열 프로세서는 레지스터라는 극히 빠른 소규모 메모리를 내장하고 있습니다. CPU의 연산 장치(ALU)는 이 레지스터에 있는 데이터만을 직접 처리할 수 있습니다. 따라서 메모리(RAM)에 있는 변수의 값을 계산에 사용하려면 반드시 그 값을 레지스터로 불러온(LOAD) 후에야 연산이 가능합니다. 컴파일러는 자주 사용되는 지역 변수를 최적화 과정에서 레지스터에 할당하기도 하여 프로그램의 실행 속도를 높입니다.
변수 관련 주요 현상과 주의점
오버플로우와 언더플로우
각 자료형은 저장할 수 있는 값의 범위가 정해져 있습니다. 예를 들어, 2바이트(16비트) 크기의 부호 있는 정수(signed short)는 -32768에서 32767까지 저장할 수 있습니다. 이 범위를 벗어나는 값, 예를 들어 32767에 1을 더하면 32768이 아닌 -32768이 됩니다. 이 현상을 오버플로우라고 합니다. 반대로 -32768에서 1을 빼면 32767이 되는 것을 언더플로우라고 합니다. 이는 메모리가 가진 비트의 표현 한계 때문에 발생하는 순환 현상으로, 예상치 못한 프로그램 오류의 원인이 될 수 있습니다.
실수형의 정밀도 오차
실수형 변수(float, double)는 소수점을 표현하기 위해 부동소수점 방식을 사용합니다. 이 방식은 넓은 범위의 수를 표현할 수 있는 대신 정밀도에 한계가 있습니다. float 형은 대략 소수점 이하 6자리까지, double 형은 약 15자리까지 정확하게 표현할 수 있습니다. 그 이상의 자리수에서는 반올림 오차가 발생할 수 있어, 금융 계산이나 정밀한 과학 계산에는 특별한 주의가 필요합니다.
변수 이해를 통한 C언어 마스터하기
변수는 단순한 데이터 보관함을 넘어, 프로그램과 컴퓨터 하드웨어(메모리, CPU)를 연결하는 핵심 다리 역할을 합니다. 변수의 자료형을 이해하면 데이터의 형태와 크기를 알 수 있고, 변수의 저장 영역을 이해하면 그 변수가 언제 생겨나고 사라지는지, 어디서 접근 가능한지 알 수 있습니다. 이는 메모리 누수, 스택 오버플로우, 예상치 못한 변수 값 변경 등 다양한 문제를 디버깅하는 데 필수적인 기초 지식이 됩니다. 특히 임베디드 시스템처럼 메모리 자원이 제한된 환경에서 프로그래밍할 때는 변수 하나의 선언과 사용에도 이러한 배경 지식이 큰 차이를 만듭니다. 변수에 대한 깊은 이해는 C언어라는 강력한 도구를 자유자재로 다루는 첫걸음이자 가장 튼튼한 기반이 될 것입니다.
코드 영역과 데이터 영역
코드 영역은 작성한 C언어 소스 코드가 기계어로 번역되어 저장되는 공간입니다. 읽기 전용이며 프로그램이 실행되는 동안 변경되지 않습니다. 데이터 영역은 전역 변수와 정적(static) 변수가 저장되는 곳입니다. 프로그램이 시작될 때 생성되어 프로그램이 종료될 때까지 메모리에 남아 있습니다. 이 영역은 다시 초기화된 데이터를 저장하는 Data 섹션과 초기화되지 않은 데이터를 저장하는 BSS 섹션으로 나뉘어 효율성을 높입니다.
스택 영역과 힙 영역
스택 영역은 함수 내에서 선언된 지역 변수, 매개변수, 함수의 반환 주소 등이 저장됩니다. 이 영역은 ‘후입선출’ 방식으로 동작합니다. 함수가 호출되면 해당 함수의 정보를 담은 ‘스택 프레임’이 스택에 쌓이고, 함수가 종료되면 이 프레임이 제거되면서 지역 변수도 자동으로 소멸합니다. 따라서 함수 밖에서는 지역 변수에 접근할 수 없습니다.
힙 영역은 개발자가 프로그램 실행 중에 동적으로 메모리를 할당받아 사용하는 공간입니다. ‘malloc()’이나 ‘calloc()’ 함수를 통해 할당받으며, 사용이 끝나면 반드시 ‘free()’ 함수로 해제해야 합니다. 해제하지 않으면 메모리 누수가 발생합니다. 스택 영역은 주소가 높은 곳에서 낮은 곳으로 자라지만, 힙 영역은 그 반대 방향으로 자라며, 이 두 영역이 서로 만나면 ‘스택 오버플로우’ 오류가 발생합니다.
변수의 저장 위치 실험과 확인
이론으로만 이해하기보다 실제 메모리 주소를 확인하면 훨씬 명확해집니다. 임베디드 개발 환경(Keil, IAR 등)이나 데스크탑 C 컴파일러의 디버거 기능을 사용하면 변수의 주소를 직접 볼 수 있습니다.
전역 변수 vs 지역 변수 vs 상수
전역 변수는 프로그램 시작 시 데이터 영역에 고정된 주소로 할당됩니다. 따라서 함수 어디에서 접근하더라도 항상 동일한 메모리 주소를 가집니다. 반면, 함수 내부의 지역 변수는 스택 영역에 할당됩니다. 같은 함수를 여러 번 호출하거나 다른 함수에서 비슷한 지역 변수를 선언하면 매번 다른 주소에 생성될 수 있습니다. 이는 스택의 동작 방식 때문입니다.
상수 데이터는 코드 영역이나 ROM(Read Only Memory)에 저장됩니다. 예를 들어, 문자열 상수 “Hello World”나 const로 선언된 변수는 실행 중 변경될 수 없도록 읽기 전용 영역에 배치되어 예기치 못한 수정을 방지합니다.

위 다이어그램은 C 프로그램의 전형적인 메모리 레이아웃을 보여줍니다. 코드와 상수가 가장 낮은 주소에, 그 위로 데이터 영역, 힙 영역이 자라고, 스택 영역은 높은 주소에서 아래로 자라는 모습을 확인할 수 있습니다.
CPU와 변수의 관계
변수가 메모리에 저장되었다고 해서 CPU가 직접 메모리에서 데이터를 읽어 연산하는 것은 아닙니다. 현대 CPU, 특히 ARM과 같은 RISC 계열 프로세서는 레지스터라는 극히 빠른 소규모 메모리를 내장하고 있습니다. CPU의 연산 장치(ALU)는 이 레지스터에 있는 데이터만을 직접 처리할 수 있습니다. 따라서 메모리(RAM)에 있는 변수의 값을 계산에 사용하려면 반드시 그 값을 레지스터로 불러온(LOAD) 후에야 연산이 가능합니다. 컴파일러는 자주 사용되는 지역 변수를 최적화 과정에서 레지스터에 할당하기도 하여 프로그램의 실행 속도를 높입니다.
변수 관련 주요 현상과 주의점
오버플로우와 언더플로우
각 자료형은 저장할 수 있는 값의 범위가 정해져 있습니다. 예를 들어, 2바이트(16비트) 크기의 부호 있는 정수(signed short)는 -32768에서 32767까지 저장할 수 있습니다. 이 범위를 벗어나는 값, 예를 들어 32767에 1을 더하면 32768이 아닌 -32768이 됩니다. 이 현상을 오버플로우라고 합니다. 반대로 -32768에서 1을 빼면 32767이 되는 것을 언더플로우라고 합니다. 이는 메모리가 가진 비트의 표현 한계 때문에 발생하는 순환 현상으로, 예상치 못한 프로그램 오류의 원인이 될 수 있습니다.
실수형의 정밀도 오차
실수형 변수(float, double)는 소수점을 표현하기 위해 부동소수점 방식을 사용합니다. 이 방식은 넓은 범위의 수를 표현할 수 있는 대신 정밀도에 한계가 있습니다. float 형은 대략 소수점 이하 6자리까지, double 형은 약 15자리까지 정확하게 표현할 수 있습니다. 그 이상의 자리수에서는 반올림 오차가 발생할 수 있어, 금융 계산이나 정밀한 과학 계산에는 특별한 주의가 필요합니다.
변수 이해를 통한 C언어 마스터하기
변수는 단순한 데이터 보관함을 넘어, 프로그램과 컴퓨터 하드웨어(메모리, CPU)를 연결하는 핵심 다리 역할을 합니다. 변수의 자료형을 이해하면 데이터의 형태와 크기를 알 수 있고, 변수의 저장 영역을 이해하면 그 변수가 언제 생겨나고 사라지는지, 어디서 접근 가능한지 알 수 있습니다. 이는 메모리 누수, 스택 오버플로우, 예상치 못한 변수 값 변경 등 다양한 문제를 디버깅하는 데 필수적인 기초 지식이 됩니다. 특히 임베디드 시스템처럼 메모리 자원이 제한된 환경에서 프로그래밍할 때는 변수 하나의 선언과 사용에도 이러한 배경 지식이 큰 차이를 만듭니다. 변수에 대한 깊은 이해는 C언어라는 강력한 도구를 자유자재로 다루는 첫걸음이자 가장 튼튼한 기반이 될 것입니다.
변수가 저장되는 메모리의 네 가지 영역
C언어 프로그램이 실행되면 운영체제는 프로그램을 위해 메모리(RAM) 공간을 할당합니다. 이 공간은 용도에 따라 크게 네 가지 영역으로 나뉘며, 변수의 종류에 따라 이 중 한 곳에 저장됩니다. 이 구분을 이해하는 것은 변수의 생명 주기와 접근 범위를 이해하는 핵심입니다.
코드 영역과 데이터 영역
코드 영역은 작성한 C언어 소스 코드가 기계어로 번역되어 저장되는 공간입니다. 읽기 전용이며 프로그램이 실행되는 동안 변경되지 않습니다. 데이터 영역은 전역 변수와 정적(static) 변수가 저장되는 곳입니다. 프로그램이 시작될 때 생성되어 프로그램이 종료될 때까지 메모리에 남아 있습니다. 이 영역은 다시 초기화된 데이터를 저장하는 Data 섹션과 초기화되지 않은 데이터를 저장하는 BSS 섹션으로 나뉘어 효율성을 높입니다.
스택 영역과 힙 영역
스택 영역은 함수 내에서 선언된 지역 변수, 매개변수, 함수의 반환 주소 등이 저장됩니다. 이 영역은 ‘후입선출’ 방식으로 동작합니다. 함수가 호출되면 해당 함수의 정보를 담은 ‘스택 프레임’이 스택에 쌓이고, 함수가 종료되면 이 프레임이 제거되면서 지역 변수도 자동으로 소멸합니다. 따라서 함수 밖에서는 지역 변수에 접근할 수 없습니다.
힙 영역은 개발자가 프로그램 실행 중에 동적으로 메모리를 할당받아 사용하는 공간입니다. ‘malloc()’이나 ‘calloc()’ 함수를 통해 할당받으며, 사용이 끝나면 반드시 ‘free()’ 함수로 해제해야 합니다. 해제하지 않으면 메모리 누수가 발생합니다. 스택 영역은 주소가 높은 곳에서 낮은 곳으로 자라지만, 힙 영역은 그 반대 방향으로 자라며, 이 두 영역이 서로 만나면 ‘스택 오버플로우’ 오류가 발생합니다.
변수의 저장 위치 실험과 확인
이론으로만 이해하기보다 실제 메모리 주소를 확인하면 훨씬 명확해집니다. 임베디드 개발 환경(Keil, IAR 등)이나 데스크탑 C 컴파일러의 디버거 기능을 사용하면 변수의 주소를 직접 볼 수 있습니다.
전역 변수 vs 지역 변수 vs 상수
전역 변수는 프로그램 시작 시 데이터 영역에 고정된 주소로 할당됩니다. 따라서 함수 어디에서 접근하더라도 항상 동일한 메모리 주소를 가집니다. 반면, 함수 내부의 지역 변수는 스택 영역에 할당됩니다. 같은 함수를 여러 번 호출하거나 다른 함수에서 비슷한 지역 변수를 선언하면 매번 다른 주소에 생성될 수 있습니다. 이는 스택의 동작 방식 때문입니다.
상수 데이터는 코드 영역이나 ROM(Read Only Memory)에 저장됩니다. 예를 들어, 문자열 상수 “Hello World”나 const로 선언된 변수는 실행 중 변경될 수 없도록 읽기 전용 영역에 배치되어 예기치 못한 수정을 방지합니다.

위 다이어그램은 C 프로그램의 전형적인 메모리 레이아웃을 보여줍니다. 코드와 상수가 가장 낮은 주소에, 그 위로 데이터 영역, 힙 영역이 자라고, 스택 영역은 높은 주소에서 아래로 자라는 모습을 확인할 수 있습니다.
CPU와 변수의 관계
변수가 메모리에 저장되었다고 해서 CPU가 직접 메모리에서 데이터를 읽어 연산하는 것은 아닙니다. 현대 CPU, 특히 ARM과 같은 RISC 계열 프로세서는 레지스터라는 극히 빠른 소규모 메모리를 내장하고 있습니다. CPU의 연산 장치(ALU)는 이 레지스터에 있는 데이터만을 직접 처리할 수 있습니다. 따라서 메모리(RAM)에 있는 변수의 값을 계산에 사용하려면 반드시 그 값을 레지스터로 불러온(LOAD) 후에야 연산이 가능합니다. 컴파일러는 자주 사용되는 지역 변수를 최적화 과정에서 레지스터에 할당하기도 하여 프로그램의 실행 속도를 높입니다.
변수 관련 주요 현상과 주의점
오버플로우와 언더플로우
각 자료형은 저장할 수 있는 값의 범위가 정해져 있습니다. 예를 들어, 2바이트(16비트) 크기의 부호 있는 정수(signed short)는 -32768에서 32767까지 저장할 수 있습니다. 이 범위를 벗어나는 값, 예를 들어 32767에 1을 더하면 32768이 아닌 -32768이 됩니다. 이 현상을 오버플로우라고 합니다. 반대로 -32768에서 1을 빼면 32767이 되는 것을 언더플로우라고 합니다. 이는 메모리가 가진 비트의 표현 한계 때문에 발생하는 순환 현상으로, 예상치 못한 프로그램 오류의 원인이 될 수 있습니다.
실수형의 정밀도 오차
실수형 변수(float, double)는 소수점을 표현하기 위해 부동소수점 방식을 사용합니다. 이 방식은 넓은 범위의 수를 표현할 수 있는 대신 정밀도에 한계가 있습니다. float 형은 대략 소수점 이하 6자리까지, double 형은 약 15자리까지 정확하게 표현할 수 있습니다. 그 이상의 자리수에서는 반올림 오차가 발생할 수 있어, 금융 계산이나 정밀한 과학 계산에는 특별한 주의가 필요합니다.
변수 이해를 통한 C언어 마스터하기
변수는 단순한 데이터 보관함을 넘어, 프로그램과 컴퓨터 하드웨어(메모리, CPU)를 연결하는 핵심 다리 역할을 합니다. 변수의 자료형을 이해하면 데이터의 형태와 크기를 알 수 있고, 변수의 저장 영역을 이해하면 그 변수가 언제 생겨나고 사라지는지, 어디서 접근 가능한지 알 수 있습니다. 이는 메모리 누수, 스택 오버플로우, 예상치 못한 변수 값 변경 등 다양한 문제를 디버깅하는 데 필수적인 기초 지식이 됩니다. 특히 임베디드 시스템처럼 메모리 자원이 제한된 환경에서 프로그래밍할 때는 변수 하나의 선언과 사용에도 이러한 배경 지식이 큰 차이를 만듭니다. 변수에 대한 깊은 이해는 C언어라는 강력한 도구를 자유자재로 다루는 첫걸음이자 가장 튼튼한 기반이 될 것입니다.
주요 자료형과 특징
| 분류 | 자료형 | 크기(Byte) | 용도 및 특징 |
|---|---|---|---|
| 정수형 | int | 4 | 가장 일반적인 정수 저장 |
| char | 1 | 단일 문자 또는 작은 정수 저장 | |
| 실수형 | double | 8 | 높은 정밀도의 소수점 계산에 사용 |
| 부호 지정 | unsigned | 자료형별 상이 | 음수를 사용하지 않아 양수 표현 범위 확대 |
자료형을 선언하는 기본 형식은 ‘자료형 변수이름;’ 입니다. 예를 들어, 정수를 저장할 변수 ‘age’는 ‘int age;’로 선언합니다. 선언과 동시에 값을 할당하는 ‘초기화’도 가능하며, ‘int age = 25;’와 같이 작성합니다. 변수 이름을 지을 때는 몇 가지 규칙이 있습니다. 영어, 숫자, 밑줄(_)만 사용 가능하며, 숫자로 시작할 수 없고, C언어에서 이미 사용 중인 키워드(int, return 등)는 사용할 수 없습니다. 가장 중요한 것은 변수의 용도를 한눈에 알 수 있도록 의미 있는 이름을 짓는 것입니다. ‘a’보다는 ‘userScore’, ‘temp’보다는 ‘currentTemperature’가 훨씬 좋은 선택입니다.
변수가 저장되는 메모리의 네 가지 영역
C언어 프로그램이 실행되면 운영체제는 프로그램을 위해 메모리(RAM) 공간을 할당합니다. 이 공간은 용도에 따라 크게 네 가지 영역으로 나뉘며, 변수의 종류에 따라 이 중 한 곳에 저장됩니다. 이 구분을 이해하는 것은 변수의 생명 주기와 접근 범위를 이해하는 핵심입니다.
코드 영역과 데이터 영역
코드 영역은 작성한 C언어 소스 코드가 기계어로 번역되어 저장되는 공간입니다. 읽기 전용이며 프로그램이 실행되는 동안 변경되지 않습니다. 데이터 영역은 전역 변수와 정적(static) 변수가 저장되는 곳입니다. 프로그램이 시작될 때 생성되어 프로그램이 종료될 때까지 메모리에 남아 있습니다. 이 영역은 다시 초기화된 데이터를 저장하는 Data 섹션과 초기화되지 않은 데이터를 저장하는 BSS 섹션으로 나뉘어 효율성을 높입니다.
스택 영역과 힙 영역
스택 영역은 함수 내에서 선언된 지역 변수, 매개변수, 함수의 반환 주소 등이 저장됩니다. 이 영역은 ‘후입선출’ 방식으로 동작합니다. 함수가 호출되면 해당 함수의 정보를 담은 ‘스택 프레임’이 스택에 쌓이고, 함수가 종료되면 이 프레임이 제거되면서 지역 변수도 자동으로 소멸합니다. 따라서 함수 밖에서는 지역 변수에 접근할 수 없습니다.
힙 영역은 개발자가 프로그램 실행 중에 동적으로 메모리를 할당받아 사용하는 공간입니다. ‘malloc()’이나 ‘calloc()’ 함수를 통해 할당받으며, 사용이 끝나면 반드시 ‘free()’ 함수로 해제해야 합니다. 해제하지 않으면 메모리 누수가 발생합니다. 스택 영역은 주소가 높은 곳에서 낮은 곳으로 자라지만, 힙 영역은 그 반대 방향으로 자라며, 이 두 영역이 서로 만나면 ‘스택 오버플로우’ 오류가 발생합니다.
변수의 저장 위치 실험과 확인
이론으로만 이해하기보다 실제 메모리 주소를 확인하면 훨씬 명확해집니다. 임베디드 개발 환경(Keil, IAR 등)이나 데스크탑 C 컴파일러의 디버거 기능을 사용하면 변수의 주소를 직접 볼 수 있습니다.
전역 변수 vs 지역 변수 vs 상수
전역 변수는 프로그램 시작 시 데이터 영역에 고정된 주소로 할당됩니다. 따라서 함수 어디에서 접근하더라도 항상 동일한 메모리 주소를 가집니다. 반면, 함수 내부의 지역 변수는 스택 영역에 할당됩니다. 같은 함수를 여러 번 호출하거나 다른 함수에서 비슷한 지역 변수를 선언하면 매번 다른 주소에 생성될 수 있습니다. 이는 스택의 동작 방식 때문입니다.
상수 데이터는 코드 영역이나 ROM(Read Only Memory)에 저장됩니다. 예를 들어, 문자열 상수 “Hello World”나 const로 선언된 변수는 실행 중 변경될 수 없도록 읽기 전용 영역에 배치되어 예기치 못한 수정을 방지합니다.

위 다이어그램은 C 프로그램의 전형적인 메모리 레이아웃을 보여줍니다. 코드와 상수가 가장 낮은 주소에, 그 위로 데이터 영역, 힙 영역이 자라고, 스택 영역은 높은 주소에서 아래로 자라는 모습을 확인할 수 있습니다.
CPU와 변수의 관계
변수가 메모리에 저장되었다고 해서 CPU가 직접 메모리에서 데이터를 읽어 연산하는 것은 아닙니다. 현대 CPU, 특히 ARM과 같은 RISC 계열 프로세서는 레지스터라는 극히 빠른 소규모 메모리를 내장하고 있습니다. CPU의 연산 장치(ALU)는 이 레지스터에 있는 데이터만을 직접 처리할 수 있습니다. 따라서 메모리(RAM)에 있는 변수의 값을 계산에 사용하려면 반드시 그 값을 레지스터로 불러온(LOAD) 후에야 연산이 가능합니다. 컴파일러는 자주 사용되는 지역 변수를 최적화 과정에서 레지스터에 할당하기도 하여 프로그램의 실행 속도를 높입니다.
변수 관련 주요 현상과 주의점
오버플로우와 언더플로우
각 자료형은 저장할 수 있는 값의 범위가 정해져 있습니다. 예를 들어, 2바이트(16비트) 크기의 부호 있는 정수(signed short)는 -32768에서 32767까지 저장할 수 있습니다. 이 범위를 벗어나는 값, 예를 들어 32767에 1을 더하면 32768이 아닌 -32768이 됩니다. 이 현상을 오버플로우라고 합니다. 반대로 -32768에서 1을 빼면 32767이 되는 것을 언더플로우라고 합니다. 이는 메모리가 가진 비트의 표현 한계 때문에 발생하는 순환 현상으로, 예상치 못한 프로그램 오류의 원인이 될 수 있습니다.
실수형의 정밀도 오차
실수형 변수(float, double)는 소수점을 표현하기 위해 부동소수점 방식을 사용합니다. 이 방식은 넓은 범위의 수를 표현할 수 있는 대신 정밀도에 한계가 있습니다. float 형은 대략 소수점 이하 6자리까지, double 형은 약 15자리까지 정확하게 표현할 수 있습니다. 그 이상의 자리수에서는 반올림 오차가 발생할 수 있어, 금융 계산이나 정밀한 과학 계산에는 특별한 주의가 필요합니다.
변수 이해를 통한 C언어 마스터하기
변수는 단순한 데이터 보관함을 넘어, 프로그램과 컴퓨터 하드웨어(메모리, CPU)를 연결하는 핵심 다리 역할을 합니다. 변수의 자료형을 이해하면 데이터의 형태와 크기를 알 수 있고, 변수의 저장 영역을 이해하면 그 변수가 언제 생겨나고 사라지는지, 어디서 접근 가능한지 알 수 있습니다. 이는 메모리 누수, 스택 오버플로우, 예상치 못한 변수 값 변경 등 다양한 문제를 디버깅하는 데 필수적인 기초 지식이 됩니다. 특히 임베디드 시스템처럼 메모리 자원이 제한된 환경에서 프로그래밍할 때는 변수 하나의 선언과 사용에도 이러한 배경 지식이 큰 차이를 만듭니다. 변수에 대한 깊은 이해는 C언어라는 강력한 도구를 자유자재로 다루는 첫걸음이자 가장 튼튼한 기반이 될 것입니다.
변수의 기본 개념과 자료형
변수는 값을 저장할 수 있는 메모리 공간입니다. C언어에서는 이 공간을 사용하기 전에 반드시 ‘이 공간에는 어떤 종류의 데이터가 들어갈 것이다’라고 미리 알려줘야 합니다. 이것이 바로 ‘자료형’을 선언하는 이유입니다. 파이썬과 같은 최신 언어와 달리 C언어는 엄격한 자료형 규칙을 가지고 있어 선언된 타입과 다른 값을 넣으면 오류가 발생하거나 예상치 못한 결과를 초래할 수 있습니다.
주요 자료형과 특징
| 분류 | 자료형 | 크기(Byte) | 용도 및 특징 |
|---|---|---|---|
| 정수형 | int | 4 | 가장 일반적인 정수 저장 |
| char | 1 | 단일 문자 또는 작은 정수 저장 | |
| 실수형 | double | 8 | 높은 정밀도의 소수점 계산에 사용 |
| 부호 지정 | unsigned | 자료형별 상이 | 음수를 사용하지 않아 양수 표현 범위 확대 |
자료형을 선언하는 기본 형식은 ‘자료형 변수이름;’ 입니다. 예를 들어, 정수를 저장할 변수 ‘age’는 ‘int age;’로 선언합니다. 선언과 동시에 값을 할당하는 ‘초기화’도 가능하며, ‘int age = 25;’와 같이 작성합니다. 변수 이름을 지을 때는 몇 가지 규칙이 있습니다. 영어, 숫자, 밑줄(_)만 사용 가능하며, 숫자로 시작할 수 없고, C언어에서 이미 사용 중인 키워드(int, return 등)는 사용할 수 없습니다. 가장 중요한 것은 변수의 용도를 한눈에 알 수 있도록 의미 있는 이름을 짓는 것입니다. ‘a’보다는 ‘userScore’, ‘temp’보다는 ‘currentTemperature’가 훨씬 좋은 선택입니다.
변수가 저장되는 메모리의 네 가지 영역
C언어 프로그램이 실행되면 운영체제는 프로그램을 위해 메모리(RAM) 공간을 할당합니다. 이 공간은 용도에 따라 크게 네 가지 영역으로 나뉘며, 변수의 종류에 따라 이 중 한 곳에 저장됩니다. 이 구분을 이해하는 것은 변수의 생명 주기와 접근 범위를 이해하는 핵심입니다.
코드 영역과 데이터 영역
코드 영역은 작성한 C언어 소스 코드가 기계어로 번역되어 저장되는 공간입니다. 읽기 전용이며 프로그램이 실행되는 동안 변경되지 않습니다. 데이터 영역은 전역 변수와 정적(static) 변수가 저장되는 곳입니다. 프로그램이 시작될 때 생성되어 프로그램이 종료될 때까지 메모리에 남아 있습니다. 이 영역은 다시 초기화된 데이터를 저장하는 Data 섹션과 초기화되지 않은 데이터를 저장하는 BSS 섹션으로 나뉘어 효율성을 높입니다.
스택 영역과 힙 영역
스택 영역은 함수 내에서 선언된 지역 변수, 매개변수, 함수의 반환 주소 등이 저장됩니다. 이 영역은 ‘후입선출’ 방식으로 동작합니다. 함수가 호출되면 해당 함수의 정보를 담은 ‘스택 프레임’이 스택에 쌓이고, 함수가 종료되면 이 프레임이 제거되면서 지역 변수도 자동으로 소멸합니다. 따라서 함수 밖에서는 지역 변수에 접근할 수 없습니다.
힙 영역은 개발자가 프로그램 실행 중에 동적으로 메모리를 할당받아 사용하는 공간입니다. ‘malloc()’이나 ‘calloc()’ 함수를 통해 할당받으며, 사용이 끝나면 반드시 ‘free()’ 함수로 해제해야 합니다. 해제하지 않으면 메모리 누수가 발생합니다. 스택 영역은 주소가 높은 곳에서 낮은 곳으로 자라지만, 힙 영역은 그 반대 방향으로 자라며, 이 두 영역이 서로 만나면 ‘스택 오버플로우’ 오류가 발생합니다.
변수의 저장 위치 실험과 확인
이론으로만 이해하기보다 실제 메모리 주소를 확인하면 훨씬 명확해집니다. 임베디드 개발 환경(Keil, IAR 등)이나 데스크탑 C 컴파일러의 디버거 기능을 사용하면 변수의 주소를 직접 볼 수 있습니다.
전역 변수 vs 지역 변수 vs 상수
전역 변수는 프로그램 시작 시 데이터 영역에 고정된 주소로 할당됩니다. 따라서 함수 어디에서 접근하더라도 항상 동일한 메모리 주소를 가집니다. 반면, 함수 내부의 지역 변수는 스택 영역에 할당됩니다. 같은 함수를 여러 번 호출하거나 다른 함수에서 비슷한 지역 변수를 선언하면 매번 다른 주소에 생성될 수 있습니다. 이는 스택의 동작 방식 때문입니다.
상수 데이터는 코드 영역이나 ROM(Read Only Memory)에 저장됩니다. 예를 들어, 문자열 상수 “Hello World”나 const로 선언된 변수는 실행 중 변경될 수 없도록 읽기 전용 영역에 배치되어 예기치 못한 수정을 방지합니다.

위 다이어그램은 C 프로그램의 전형적인 메모리 레이아웃을 보여줍니다. 코드와 상수가 가장 낮은 주소에, 그 위로 데이터 영역, 힙 영역이 자라고, 스택 영역은 높은 주소에서 아래로 자라는 모습을 확인할 수 있습니다.
CPU와 변수의 관계
변수가 메모리에 저장되었다고 해서 CPU가 직접 메모리에서 데이터를 읽어 연산하는 것은 아닙니다. 현대 CPU, 특히 ARM과 같은 RISC 계열 프로세서는 레지스터라는 극히 빠른 소규모 메모리를 내장하고 있습니다. CPU의 연산 장치(ALU)는 이 레지스터에 있는 데이터만을 직접 처리할 수 있습니다. 따라서 메모리(RAM)에 있는 변수의 값을 계산에 사용하려면 반드시 그 값을 레지스터로 불러온(LOAD) 후에야 연산이 가능합니다. 컴파일러는 자주 사용되는 지역 변수를 최적화 과정에서 레지스터에 할당하기도 하여 프로그램의 실행 속도를 높입니다.
변수 관련 주요 현상과 주의점
오버플로우와 언더플로우
각 자료형은 저장할 수 있는 값의 범위가 정해져 있습니다. 예를 들어, 2바이트(16비트) 크기의 부호 있는 정수(signed short)는 -32768에서 32767까지 저장할 수 있습니다. 이 범위를 벗어나는 값, 예를 들어 32767에 1을 더하면 32768이 아닌 -32768이 됩니다. 이 현상을 오버플로우라고 합니다. 반대로 -32768에서 1을 빼면 32767이 되는 것을 언더플로우라고 합니다. 이는 메모리가 가진 비트의 표현 한계 때문에 발생하는 순환 현상으로, 예상치 못한 프로그램 오류의 원인이 될 수 있습니다.
실수형의 정밀도 오차
실수형 변수(float, double)는 소수점을 표현하기 위해 부동소수점 방식을 사용합니다. 이 방식은 넓은 범위의 수를 표현할 수 있는 대신 정밀도에 한계가 있습니다. float 형은 대략 소수점 이하 6자리까지, double 형은 약 15자리까지 정확하게 표현할 수 있습니다. 그 이상의 자리수에서는 반올림 오차가 발생할 수 있어, 금융 계산이나 정밀한 과학 계산에는 특별한 주의가 필요합니다.
변수 이해를 통한 C언어 마스터하기
변수는 단순한 데이터 보관함을 넘어, 프로그램과 컴퓨터 하드웨어(메모리, CPU)를 연결하는 핵심 다리 역할을 합니다. 변수의 자료형을 이해하면 데이터의 형태와 크기를 알 수 있고, 변수의 저장 영역을 이해하면 그 변수가 언제 생겨나고 사라지는지, 어디서 접근 가능한지 알 수 있습니다. 이는 메모리 누수, 스택 오버플로우, 예상치 못한 변수 값 변경 등 다양한 문제를 디버깅하는 데 필수적인 기초 지식이 됩니다. 특히 임베디드 시스템처럼 메모리 자원이 제한된 환경에서 프로그래밍할 때는 변수 하나의 선언과 사용에도 이러한 배경 지식이 큰 차이를 만듭니다. 변수에 대한 깊은 이해는 C언어라는 강력한 도구를 자유자재로 다루는 첫걸음이자 가장 튼튼한 기반이 될 것입니다.
C언어를 배울 때 가장 먼저 마주치는 개념이 변수입니다. 변수는 프로그램이 데이터를 잠시 보관하는 메모리 공간에 붙인 이름표와 같습니다. 게임 캐릭터의 레벨, 체력, 아이템 정보부터 계산기의 숫자까지 모든 데이터는 변수를 통해 메모리에 저장되고 CPU에 의해 연산됩니다. 이 글에서는 변수가 무엇인지, 어떻게 선언하고 사용하는지, 그리고 가장 중요한 ‘변수가 실제로 컴퓨터 메모리의 어디에 저장되는지’에 대해 깊이 알아보겠습니다. 변수의 동작 원리를 이해하면 메모리 부족 오류, 변수 값의 예상치 못한 변화, 프로그램 성능 등 더 넓은 개념을 자연스럽게 이해할 수 있게 됩니다.
변수의 기본 개념과 자료형
변수는 값을 저장할 수 있는 메모리 공간입니다. C언어에서는 이 공간을 사용하기 전에 반드시 ‘이 공간에는 어떤 종류의 데이터가 들어갈 것이다’라고 미리 알려줘야 합니다. 이것이 바로 ‘자료형’을 선언하는 이유입니다. 파이썬과 같은 최신 언어와 달리 C언어는 엄격한 자료형 규칙을 가지고 있어 선언된 타입과 다른 값을 넣으면 오류가 발생하거나 예상치 못한 결과를 초래할 수 있습니다.
주요 자료형과 특징
| 분류 | 자료형 | 크기(Byte) | 용도 및 특징 |
|---|---|---|---|
| 정수형 | int | 4 | 가장 일반적인 정수 저장 |
| char | 1 | 단일 문자 또는 작은 정수 저장 | |
| 실수형 | double | 8 | 높은 정밀도의 소수점 계산에 사용 |
| 부호 지정 | unsigned | 자료형별 상이 | 음수를 사용하지 않아 양수 표현 범위 확대 |
자료형을 선언하는 기본 형식은 ‘자료형 변수이름;’ 입니다. 예를 들어, 정수를 저장할 변수 ‘age’는 ‘int age;’로 선언합니다. 선언과 동시에 값을 할당하는 ‘초기화’도 가능하며, ‘int age = 25;’와 같이 작성합니다. 변수 이름을 지을 때는 몇 가지 규칙이 있습니다. 영어, 숫자, 밑줄(_)만 사용 가능하며, 숫자로 시작할 수 없고, C언어에서 이미 사용 중인 키워드(int, return 등)는 사용할 수 없습니다. 가장 중요한 것은 변수의 용도를 한눈에 알 수 있도록 의미 있는 이름을 짓는 것입니다. ‘a’보다는 ‘userScore’, ‘temp’보다는 ‘currentTemperature’가 훨씬 좋은 선택입니다.
변수가 저장되는 메모리의 네 가지 영역
C언어 프로그램이 실행되면 운영체제는 프로그램을 위해 메모리(RAM) 공간을 할당합니다. 이 공간은 용도에 따라 크게 네 가지 영역으로 나뉘며, 변수의 종류에 따라 이 중 한 곳에 저장됩니다. 이 구분을 이해하는 것은 변수의 생명 주기와 접근 범위를 이해하는 핵심입니다.
코드 영역과 데이터 영역
코드 영역은 작성한 C언어 소스 코드가 기계어로 번역되어 저장되는 공간입니다. 읽기 전용이며 프로그램이 실행되는 동안 변경되지 않습니다. 데이터 영역은 전역 변수와 정적(static) 변수가 저장되는 곳입니다. 프로그램이 시작될 때 생성되어 프로그램이 종료될 때까지 메모리에 남아 있습니다. 이 영역은 다시 초기화된 데이터를 저장하는 Data 섹션과 초기화되지 않은 데이터를 저장하는 BSS 섹션으로 나뉘어 효율성을 높입니다.
스택 영역과 힙 영역
스택 영역은 함수 내에서 선언된 지역 변수, 매개변수, 함수의 반환 주소 등이 저장됩니다. 이 영역은 ‘후입선출’ 방식으로 동작합니다. 함수가 호출되면 해당 함수의 정보를 담은 ‘스택 프레임’이 스택에 쌓이고, 함수가 종료되면 이 프레임이 제거되면서 지역 변수도 자동으로 소멸합니다. 따라서 함수 밖에서는 지역 변수에 접근할 수 없습니다.
힙 영역은 개발자가 프로그램 실행 중에 동적으로 메모리를 할당받아 사용하는 공간입니다. ‘malloc()’이나 ‘calloc()’ 함수를 통해 할당받으며, 사용이 끝나면 반드시 ‘free()’ 함수로 해제해야 합니다. 해제하지 않으면 메모리 누수가 발생합니다. 스택 영역은 주소가 높은 곳에서 낮은 곳으로 자라지만, 힙 영역은 그 반대 방향으로 자라며, 이 두 영역이 서로 만나면 ‘스택 오버플로우’ 오류가 발생합니다.
변수의 저장 위치 실험과 확인
이론으로만 이해하기보다 실제 메모리 주소를 확인하면 훨씬 명확해집니다. 임베디드 개발 환경(Keil, IAR 등)이나 데스크탑 C 컴파일러의 디버거 기능을 사용하면 변수의 주소를 직접 볼 수 있습니다.
전역 변수 vs 지역 변수 vs 상수
전역 변수는 프로그램 시작 시 데이터 영역에 고정된 주소로 할당됩니다. 따라서 함수 어디에서 접근하더라도 항상 동일한 메모리 주소를 가집니다. 반면, 함수 내부의 지역 변수는 스택 영역에 할당됩니다. 같은 함수를 여러 번 호출하거나 다른 함수에서 비슷한 지역 변수를 선언하면 매번 다른 주소에 생성될 수 있습니다. 이는 스택의 동작 방식 때문입니다.
상수 데이터는 코드 영역이나 ROM(Read Only Memory)에 저장됩니다. 예를 들어, 문자열 상수 “Hello World”나 const로 선언된 변수는 실행 중 변경될 수 없도록 읽기 전용 영역에 배치되어 예기치 못한 수정을 방지합니다.

위 다이어그램은 C 프로그램의 전형적인 메모리 레이아웃을 보여줍니다. 코드와 상수가 가장 낮은 주소에, 그 위로 데이터 영역, 힙 영역이 자라고, 스택 영역은 높은 주소에서 아래로 자라는 모습을 확인할 수 있습니다.
CPU와 변수의 관계
변수가 메모리에 저장되었다고 해서 CPU가 직접 메모리에서 데이터를 읽어 연산하는 것은 아닙니다. 현대 CPU, 특히 ARM과 같은 RISC 계열 프로세서는 레지스터라는 극히 빠른 소규모 메모리를 내장하고 있습니다. CPU의 연산 장치(ALU)는 이 레지스터에 있는 데이터만을 직접 처리할 수 있습니다. 따라서 메모리(RAM)에 있는 변수의 값을 계산에 사용하려면 반드시 그 값을 레지스터로 불러온(LOAD) 후에야 연산이 가능합니다. 컴파일러는 자주 사용되는 지역 변수를 최적화 과정에서 레지스터에 할당하기도 하여 프로그램의 실행 속도를 높입니다.
변수 관련 주요 현상과 주의점
오버플로우와 언더플로우
각 자료형은 저장할 수 있는 값의 범위가 정해져 있습니다. 예를 들어, 2바이트(16비트) 크기의 부호 있는 정수(signed short)는 -32768에서 32767까지 저장할 수 있습니다. 이 범위를 벗어나는 값, 예를 들어 32767에 1을 더하면 32768이 아닌 -32768이 됩니다. 이 현상을 오버플로우라고 합니다. 반대로 -32768에서 1을 빼면 32767이 되는 것을 언더플로우라고 합니다. 이는 메모리가 가진 비트의 표현 한계 때문에 발생하는 순환 현상으로, 예상치 못한 프로그램 오류의 원인이 될 수 있습니다.
실수형의 정밀도 오차
실수형 변수(float, double)는 소수점을 표현하기 위해 부동소수점 방식을 사용합니다. 이 방식은 넓은 범위의 수를 표현할 수 있는 대신 정밀도에 한계가 있습니다. float 형은 대략 소수점 이하 6자리까지, double 형은 약 15자리까지 정확하게 표현할 수 있습니다. 그 이상의 자리수에서는 반올림 오차가 발생할 수 있어, 금융 계산이나 정밀한 과학 계산에는 특별한 주의가 필요합니다.
변수 이해를 통한 C언어 마스터하기
변수는 단순한 데이터 보관함을 넘어, 프로그램과 컴퓨터 하드웨어(메모리, CPU)를 연결하는 핵심 다리 역할을 합니다. 변수의 자료형을 이해하면 데이터의 형태와 크기를 알 수 있고, 변수의 저장 영역을 이해하면 그 변수가 언제 생겨나고 사라지는지, 어디서 접근 가능한지 알 수 있습니다. 이는 메모리 누수, 스택 오버플로우, 예상치 못한 변수 값 변경 등 다양한 문제를 디버깅하는 데 필수적인 기초 지식이 됩니다. 특히 임베디드 시스템처럼 메모리 자원이 제한된 환경에서 프로그래밍할 때는 변수 하나의 선언과 사용에도 이러한 배경 지식이 큰 차이를 만듭니다. 변수에 대한 깊은 이해는 C언어라는 강력한 도구를 자유자재로 다루는 첫걸음이자 가장 튼튼한 기반이 될 것입니다.





