메모리 주소 호출해보자 (C)

Kim Jay·2023년 3월 14일
0

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); // 해당 주소에 저장된 값 출력
}

결과

다행히 잘 나온다.
엇? 근데 위에서 나왔던 주소와 다른 곳에 저장되어 있다.


실제로 여러번 연속으로 실행했더니 매번 주소가 바뀜을 확인할 수 있다.

그래서 저 주소 자체를 복붙한 다음 컴파일하니까 에러가 뜬 것이다.

-> 메모리 주소가 계속 바뀌는 것은 보안상 이유라고 한다.

profile
넓이에 깊이 더하기

0개의 댓글