C에서의 메모리 주소: 초보자 가이드

안녕하세요, 열망하는 프로그래머 여러분! 오늘 우리는 C에서의 메모리 주소에 대해 흥미로운 세상으로 뛰어들어 보겠습니다. 코드를 한 줄도 작성해 본 적이 없더라도 걱정 마세요 - 저는 이 개념을 단계별로 안내해 드릴 것입니다. 수년 동안 수많은 학생들을 가르친 경험을 바탕으로 말이죠. 이 흥미로운 여정을 함께 시작해 보겠습니다!

C - Memory Address

메모리 주소란?

컴퓨터의 메모리를 거대한 아파트 빌딩으로 상상해 보세요. 각 아파트(또는 메모리 위치)는 고유한 주소를 가지고 있습니다. C 프로그래밍에서 생성하는 각 변수는 이 빌딩에서 아파트를 빌리는 것과 같습니다. 메모리 주소는 단순히 변수가 컴퓨터의 메모리에 있는 "도로 주소"입니다.

간단한 예를 보겠습니다:

#include <stdio.h>

int main() {
int age = 25;
printf("age의 값: %d\n", age);
printf("age의 주소: %p\n", (void*)&age);
return 0;
}

이 코드를 실행하면 다음과 같은 것을 보게 될 겁니다:

age의 값: 25
age의 주소: 0x7ffd5e8e1e44

이상하게 보이는 숫자(0x7ffd5e8e1e44)는 우리의 'age' 변수의 메모리 주소입니다. 이는 16진수 형식이므로 낯설게 보일 수 있습니다!

메모리의 세그먼트

이제 우리 메모리 아파트 빌딩의 다양한 "동네"에 대해 이야기해 보겠습니다. C에서 메모리는 여러 가지 세그먼트로 나뉩니다:

  1. 텍스트 세그먼트: 프로그램의 지시어가 저장되는 곳.
  2. 데이터 세그먼트: 전역 변수와 정적 변수가 저장됩니다.
  3. 스택: 지역 변수와 함수 호출이 저장됩니다.
  4. 힙: 동적 메모리 할당이 일어나는 곳입니다.

다음은 간단한 시각화입니다:

+----------------+
|   텍스트 세그먼트   |
+----------------+
|  데이터 세그먼트  |
+----------------+
|     스택      |
|      ↓ ↑       |
|                |
|                |
|      ↑ ↓       |
|     힙       |
+----------------+

메모리 주소에 접근하기

C에서 변수의 메모리 주소에 접근하려면 '&' 연산자를 사용합니다. 이전 예제를 확장해 보겠습니다:

#include <stdio.h>

int main() {
int age = 25;
int *ptr = &age;

printf("age의 값: %d\n", age);
printf("age의 주소: %p\n", (void*)&age);
printf("ptr의 값: %p\n", (void*)ptr);
printf("ptr이 가리키는 주소의 값: %d\n", *ptr);

return 0;
}

이 코드는 포인터를 소개합니다. 포인터는 메모리 주소를 저장하는 변수입니다. 이 경우, 'ptr'는 'age'의 주소를 가리킵니다.

C 컴파일러가 메모리를 어떻게 할당하나요?

C 컴파일러는 초고속 아파트 관리자입니다. 변수가 어디서 어떻게 선언되는지에 따라 메모리를 다양한 방식으로 할당합니다:

  1. 전역 변수: 데이터 세그먼트에 저장됩니다.
  2. 지역 변수: 스택에 저장됩니다.
  3. 동적 할당: 힙에 저장됩니다.

다음은 이 세 가지를 모두 보여주는 예제입니다:

#include <stdio.h>
#include <stdlib.h>

int global_var = 10;  // 전역 변수

void function() {
int local_var = 20;  // 지역 변수
printf("local_var의 주소: %p\n", (void*)&local_var);
}

int main() {
int *heap_var = (int*)malloc(sizeof(int));  // 동적 할당
*heap_var = 30;

printf("global_var의 주소: %p\n", (void*)&global_var);
function();
printf("heap_var의 주소: %p\n", (void*)heap_var);

free(heap_var);  // 동적으로 할당된 메모리를 해제하지 않으면 안 됩니다!
return 0;
}

이 코드를 실행하면 주소가 다른 범위에 있음을 알 수 있습니다. 이는 메모리의 다른 위치에 저장되었음을 나타냅니다.

C에서 일반적으로 사용되는 메모리 관련 함수

다음은 C에서 메모리 조작에 일반적으로 사용되는 함수 표입니다:

함수 설명 사용법
malloc() 힙에 메모리를 할당합니다 ptr = malloc(size)
calloc() 메모리를 할당하고 0으로 초기화합니다 ptr = calloc(n, size)
realloc() 이전에 할당된 메모리를 새로운 크기로 조정합니다 ptr = realloc(ptr, new_size)
free() 메모리를 해제합니다 free(ptr)
memcpy() 메모리에서 한 위치를 다른 위치로 복사합니다 memcpy(dest, src, size)
memset() 메모리 블록을 특정 값으로 설정합니다 memset(ptr, value, size)

기억하시라, 강력한 힘에는 큰 책임이 따릅니다! 동적으로 할당된 메모리를 항상 해제하여 메모리 누수를 방지하세요.

결론

축하합니다! 지금까지 C의 메모리 관리 세상으로的第一步을踏み出しました。初めては少し驚くかもしれませんが、練習を重ねることで徐々に慣れていくでしょう。

Cのメモリを理解することは、新しい都市をナビゲートすることのようなものです。初めはすべてが混乱して見えるかもしれませんが、更多に探索を進めるにつれて、ランドマークを認識し、すべてがどのように組み合わさっているかを理解するようになります。

続けて練習し、好奇心を持ち、間違いを恐れずに - それが学びの方法です!未来のCプログラマーとして、ハッピーコーディングを!

Credits: Image by storyset