그라운드 임베디드 EN 유튜브 구독

실험실

포인터와 메모리 시뮬레이션

C 코드를 한 줄씩 실행하면서 메모리 칸의 값과 포인터가 가리키는 곳이 어떻게 바뀌는지 봅니다. 배열과 포인터 연산, 값 전달과 주소 전달, 배열 밖에 쓰는 버그까지 네 가지 예제를 돌려 봅니다.

조작

코드 노란 줄이 방금 실행한 줄

측정

실행한 줄
0
포인터 값
-
가리키는 변수
-
따라가서 읽은 값
-

이렇게 해 보세요

  1. 상자 하나가 메모리 4바이트입니다. 위에는 변수 이름, 아래에는 주소, 가운데에는 지금 들어 있는 값이 적혀 있습니다.
  2. 다음 줄을 누르면 코드가 한 줄 실행됩니다. int *p = &a;가 실행되면 p 상자에 a의 주소가 들어가고, 노란 화살표가 p에서 a로 이어집니다.
  3. *p = 30;을 실행해 보세요. p 상자는 그대로인데 화살표 끝에 있는 a의 값이 바뀝니다. 별표는 "그 주소로 가서"라는 뜻입니다.
  4. 예제를 배열과 포인터 연산으로 바꾸세요. p++는 주소에 1이 아니라 4를 더합니다. int 한 칸을 건너뛰기 때문입니다.
  5. 값 전달과 주소 전달에서는 함수가 불릴 때 새 상자가 생깁니다. 값을 넘기면 복사본만 바뀌고, 주소를 넘기면 원본이 바뀝니다.
  6. 배열 밖에 쓰기를 끝까지 실행하면 반복문이 한 번 더 돌아 배열 바로 옆 변수를 덮어씁니다. C는 이것을 막아 주지 않습니다.

읽는 법

변수는 메모리 어딘가에 자리를 잡고, 그 자리의 번호가 주소입니다. 포인터는 그 번호를 값으로 가지는 변수입니다. p를 읽으면 주소가, *p를 읽으면 그 주소에 있는 값이 나옵니다.

함수의 지역 변수는 호출될 때 스택에 생기고 함수가 끝나면 사라집니다. 이 실험실에서 함수 상자가 나타났다 없어지는 것이 그 모습입니다.

주소는 STM32의 RAM 시작 주소(0x20000000)를 본떠 예시로 붙였습니다. 실제 배치는 컴파일러와 최적화에 따라 달라집니다.

자세한 설명은 포인터 노트와 배열과 문자열 노트에 있습니다.

FREE PDF무료 전자책 3권 받기돌려 본 원리를 글로 정리해 두고 싶다면. BLDC 모터 제어, 직렬통신, 센서를 책 분량으로 묶었습니다. 이메일만 남기면 바로 받습니다.무료로 받기 →