[C, C++] 메모리 직접 접근으로 값 변경, 출력

메모리 직접 접근

C언어에서의 메모리 접근은 포인터를 이용하지만 포인터를 사용하지 않고 직접 접근할 수도 있다. 그러나 일반적으로 커널 영역을 이용하지 않고 하드웨어를 직접 접근하는 것은 위험한 행위라서 권장하지는 않는다. 물론 메모리에 대한 정보를 정확히 알 수 있다면 이 위험성은 덜어낼 수 있을 것이다.

직접 접근할 메모리 확인을 위한 포인터 p를 만들고 값을 넣어준다. 그리고 포인터 p의 주소를 16진수로 출력한다.

int main(){
    int a = 30;
    int *p = &a;
    printf("addr : %x, value : %d\n", p, *p);
}

print문을 통해서 0x61ff18에 30이 입력된 것을 확인했다. 이제 0x61ff18의 값을 10으로 변경할 것이다.

int main(){
    int a = 30;
    int *p = &a;
    printf("addr : %x, value : %d\n", p, *p);

    printf("value : %d\n", *p);
    *(unsigned char *)0x61ff18 = 10;
    printf("value : %d\n", *p);
}

0x61ff18의 값이 30에서 10으로 변경된 것을 확인할 수 있다.

위와 같이 메모리를 직접 접근하는 방법은 *(자료형*)주소이다. 이를 매크로로 만들 수도 있다.

#define ADDR *(unsigned char *)0x61ff18
int main(){
    int a = 30;
    int *p = &a;
    printf("addr : %x, value : %d\n", p, *p);

    printf("value : %d\n", *p);
    ADDR = 10;
    printf("value : %d\n", *p);
}

Leave a Comment