포인터 변수와 메모리의 관계

JangDongyul·2022년 2월 9일
0

1. C언어의 포인터 변수는 변수의 주소를 저장할 수 있다고 배웁니다.

int i = 10;
int* p;
p = &i;
2. 그런데, 이 변수의 주소가 무엇인지 궁금하셨을겁니다.

-> 메모리 상에서 변수가 위치한 주소를 말합니다.

아직 두리뭉실하시지요?

컴퓨터의 동작과정과 연관시켜 설명드리겠습니다.

3.

간단히 설명드리겠습니다.

(더 자세한 내용은 운영체제를 검색해보시면서 공부해보시길 권장드립니다.)

컴퓨터의 보조기억장치(HDD, SDD) 안에는 프로그램 파일들이 저장되어있습니다.

알집도 프로그램 파일이고, 파워포인트도 프로그램 파일이고, 게임도 프로그램 파일입니다.

컴퓨터 사용자가 보조기억장치의 프로그램을 실행시키면
RAM 이라는 주기억장치에 프로그램이 올라가서 실행할 수 있는 상태가 되는데,

이 상태의 프로그램을 '프로세스'라고 합니다.
'프로세스'는 "실행 중인 프로그램" 을 의미합니다.

작업관리자를 켜시면 실행 중인 프로세스들이 보이십니다.
메모리가 RAM을 의미해요

파워포인트 프로세스가 RAM에서 124.0MB 를 차지한 것을 확인하실 수 있습니다.

그런데, 사실 메모리에 올라간 프로세스가 "실행 중인 프로그램" 을 의미하기는 하지만

실제로 실행이 되려면
컴퓨터의 중앙처리장치인 CPU를 점유해야 합니다.
CPU가 컴퓨터의 연산처리를 담당하는 대뇌역할을 하기 때문입니다.


프로세스가 CPU를 점유하는 시간 동안에 실제로 실행이 되는 것입니다.
요즘 컴퓨터들은 CPU 성능이 좋아서 여러가지 프로세스들을 동시에 실행시킬 수 있다고 합니다.

다시 포인터 변수로 넘어와서

include<stdio.h>

int main()
{
	int i = 10;
	printf("%d\n", i);

	int* p;
	p = &i;

	printf("%d\n", p);
	printf("%d\n", *p);
	
	return 0;

int i의 주소에 대해 말씀드리겠습니다.

네 바로 RAM 상의 주소를 말하는 겁니다.

조금 더 깊게 가볼게요

이 프로세스 하나가 어떻게 이루어져 있냐면

프로세스의 메모리구조는 아래의 그림처럼 구성되어있습니다.

크게 유저영역커널영역으로 나눌 수 있고

유저영역은

스택(STACK), 사용되지 않는 메모리(UNUSED MEMORY), 힙(HEAP), 데이터(DATA), 코드(CODE, TEXT 라고도 부름) 세그먼트로 이루어져 있습니다.

(스택 세그먼트, 힙 세그먼트 , 데이터 세그먼트를 묶어서 데이터 세그먼트로 보기도 해요)

각 영역에는 아래의 정보들이 저장됩니다.

1. 스택: 지역변수, 매개변수, 리턴값

2. 힙: 동적할당 공간(malloc), 프로그래머가 필요할 때마다 사용하는 메모리 영역

3. Unused memory: 이 공간이 부족하면, 스택이나 힙의 공간을 더 늘릴 수 없습니다.

4.. 데이터: 전역변수, 정적변수

5. 코드(택스트라고도 부름): 사용자가 작성한 프로그램 함수들의 코드(상수 포함)가 CPU에서 수행할 수 있는 기계어 명령 형태로 있는 공간

즉, 우리가 프로그래밍하기 위해 소스코드를 짜면

  1. 이 소스코드가 프로그램이 되고,

  2. 실행을 하여 RAM에 올라가 프로세스가 될 때

  3. 각 정보들이 자신의 영역에 저장이 되는 것이죠

아까 스택에는 지역변수가 저장된다고 했습니다.

int i 는 main() 이라는 함수 안에서 선언되어있으므로

지역변수입니다.

즉, 스택에 저장이 됩니다.

결국 RAM(메모리) 안의 스택 세그먼트 어딘가에
지역변수 i가 저장되어 있는 것입니다.

이때 i 변수의 주소가 있을 것이고

포인터변수는

변수의 주소를 저장하기 위해 존재합니다.

즉 이 소스코드에서
변수 i와 포인터 변수는 아래의 그림처럼
메모리 내에 있는 프로세스 내에 있는 스택 세그먼트에 저장되어 있는 것입니다.

이 글은 동아리 튜터링을 하면서 정리한 글이기에
Medium 동아리 블로그와 개인 블로그에도 같이 게시했습니다
동아리 Medium 블로그 링크
개인 Medium 블로그 링크

0개의 댓글