23. const와 포인터

P4·2023년 6월 15일
0
post-thumbnail

const와 포인터가 만났을때

  • const는 상수 (const int a = 100; 이면 a = 101은 안됨, 100 = 101과 같게 쓴거임)

  • 여기서 a같은 상수를 r-value라고 함, 바뀔 수 있는 변수는 l-value

  • 하지만 상수의 값을 바꿀 수 없는건 아님, 그냥 문법상으로만 못바꾼다는거지 만약 포인터를 사용한다면?

주소를 알아내서 아예 메모리에 담긴 값을 바꾸면 값이 바뀜

#include <stdio.h>

int main(void)
{
	const int cint = 100;

	int* test_cint = (int*)&cint;

	*test_cint = 200;

	printf("%d", cint);

	return 0;
}
  • 이 코드에서는 cint가 200이 됨, 그런데?

  • 출력은 100으로 나오고 로컬에서의 cint 값만 200으로 바뀜

  • 이걸 확인하려면 디버그 모드에서 디스어셈블리로 들어가서 봐야함 (확인해보면 에디터가 상수로 판단하고 있기 때문에 레지스터에 임시로 저장된 값 100을 가져오는거임)


#include <stdio.h>

int main(void)
{
	volatile const int cint = 100;

	int* test_cint = (int*)&cint;

	*test_cint = 200;

	printf("%d", cint);

	return 0;
}
  • volatile: 레지스터 최적화 사용하지 않음, 이걸 사용하면 제대로 200이 출력됨

  • 좀 더 자세히 설명하면 이걸 선언하면 최적화를 통해서 레지스터를 사용하지 말고 무조건 이 주소로 이동해서 확인을 하라는 뜻임

  • 원래같으면 const로 선언해놓고 이렇게 강제로 바꾸면 안됨, 그냥 실험용으로 이렇게 된것

profile
지식을 담습니다.

0개의 댓글