[C] const, const 값 바꾸기
- const란?
const는 변동되지 않는 상수를 뜻한다.
const int cint = 100; // cint 값을 변동하지 못한다.
- -value : 상수
- l-value : 변수
C라는 문법이 const를 쓰면 값이 변동되는 것을 문법적으로 막아줄 뿐이지 정말로 진짜 상수처럼 값을 절대 바꿀 수 없는 것은 아니다
- Q: 그러면 const에 상수의 값을 어떻게 바꿀 수 있는가?
A: 포인터로 주소로 직접 가서 값을 바꾸면 된다!
const int cint = 100;
pInt = (int*)&cint;
*pInt = 300;
printf("cint 출력: %d \n", cint);
디버깅을 하면 300이 안 나온다. 물론 값은 300으로 바뀌어 있다!
cint를 const로 인해 100인 상수로 판단하고 pointer로 주소에 값을 300으로 바꾼 것도 잘 진행된다.
그런데 printf 출력을 할때, 컴파일러 최적화 과정에서 레지스터에서 아까 저장해둔 cint는 상수니까 100이라는 기억하는 값을 그대로 썼다.
굳이 실제 주소까지 가서 값을 읽어 오지 않음(문제점)
- 해결 방법
volatile const int cint = 100;
pInt = (int*)&cint;
*pInt = 300;
printf("cint 출력: %d \n", cint);
디버깅을 하면 하면 300이 나온다.
volatile는 레지스터 최적화를 통해 확인하지 말고 진짜로 주소 가서 값을 확인해라는 뜻.
- 레지스터 최적화: 컴파일러에서 자주 쓰이는 변수를 자동으로 레지스터에 저장해둠으로 인해 수행 속도를 높이는 최적화 기법
const로 상수 취급을 하지만 정말 완벽한 상수가 아니란 걸 설명하고자 했다. 물론 포인터로 강제로 값을 바꾸는 게 좋은 방법이 아니다. 이게 가능하다는 걸 확인할 수 있다는 것!
(번외 잡담)
오늘 포스팅에선 코드를 여태까지의 포스팅처럼 인용문으로 넣지 않고 코드 블록으로 작성해 보았습니다!
ㅎㅎㅎ...이런 기능이 있다는 걸 다른 블로그 보면서 알고 있었는데 왜 지금까지 안 쓰고 있었는지 의문입니다. 앞으로는 코드 블록으로 작성해서 올리려고요! 알록달록 색깔이 이쁘네요.
'공부 > C, C++' 카테고리의 다른 글
[C] 문자열, wchar_t (0) | 2022.01.09 |
---|---|
[C] const 와 포인터 (0) | 2022.01.04 |
[C] 포인터 Pointer (0) | 2022.01.03 |
[C] 구조체 (0) | 2022.01.02 |
[C] 변수(지역 변수, 전역 변수, 정적 변수, 외부 변수) (0) | 2022.01.02 |
댓글