C언어에서는 변수의 메모리상 주소와 특정 주소에 저장돼있는 값을 호출해볼 수 있다.
변수의 메모리상 주소를 호출할 때는 &
(형식지정자는 %p
(pointer))
특정 주소에 저장돼있는 값을 호출할 때는 *
를 사용한다.
&
: 주소가 어디야? *
: 그 주소로 가줘코드
#include <stdio.h>
int main (void){
int n = 5;
printf("%p\n", &n); // 메모리 속 n이 저장된 주소 출력
}
결과
메모리 주소는 16진수로 표현됨을 확인할 수 있다.
그럼 해당 주소를 다시 불러와보면 어떻게 될까?
코드2
#include <stdio.h>
int main (void){
int n = 5;
printf("%p\n", &n); // 메모리 속 n이 저장된 주소 출력
printf("%i\n", *0x7ffe8dd23d8c); // 해당 주소에 저장된 값 출력
}
결과
컴파일 과정에서 에러가 떠버린다.
(indirection requires pointer operand)
포인터가 잘못되었다는 식으로 나오는데, 왜일까?
그럼 주소를 &n
으로 지정하여 n이 저장된 곳으로 고정해보자.
코드3
#include <stdio.h>
int main (void){
int n = 5;
printf("%p\n", &n); // 메모리 속 n이 저장된 주소 출력
printf("%i\n", *&n); // 해당 주소에 저장된 값 출력
}
결과
다행히 잘 나온다.
엇? 근데 위에서 나왔던 주소와 다른 곳에 저장되어 있다.
실제로 여러번 연속으로 실행했더니 매번 주소가 바뀜을 확인할 수 있다.
그래서 저 주소 자체를 복붙한 다음 컴파일하니까 에러가 뜬 것이다.
-> 메모리 주소가 계속 바뀌는 것은 보안상 이유라고 한다.