본문 바로가기
공부/C, C++

[C] const, const 값 바꾸기

by 김샤랑 2022. 1. 4.

[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

댓글