
Result
str : sentence
pstr : sentence
전 이 결과값을 보고 처음에 제대로 나온게 맞는지 의문이 들었습니다. str 은 당연히 문자열이므로 sentence 가 나올 것이라 예상 했지만 *pstr 은 sentence 라는 문자열을 가르키는 포인터가 pstr 이네, 그럼 printf 하고 pstr 을 하면 sentence 가 저장된 주소값이 나와야겠군. sentence 가 출력되려면 포인터가 가진 값을 나타내는 *pstr 이라고 해줘야되겠군 했는데 아니었다. 왜 이런 결과값이 나왔는지 살펴보자.
여기서 우리는 리터럴(Literal) 이라는 개념을 알아야한다.
프로그래밍 언어에서 리터럴이란 소스 코드 상에서 고정된 값을 가지는 것을 말한다. 특히 c언어의 경우 따옴표("") 로 묶인 것들을 문자열 리터럴(string literal) 이라 부른다.
char *pstr = "goodbye";
printf("why so serious?");
scanf("%c", str[0]);
위 3개의 goodbye, why so serious, %c 모두 리터럴이다. 컴퓨터는 이러한 리터럴들을 따로 모아서 보관한다. 즉 프로그램을 실행하면 메모리 상에 특별한 곳에 goodbye, why so serious, %c 와 같은 리터럴들이 보관되어 있는 공간이 생긴다는 것이다.
따라서 char *pstr = "goodbye"; 를 실행하면 컴퓨터는 "goodbye" 의 시작 주소값을 가져와서 pstr 에 대입하라는 작업을 진행한다. 따라서 pstr 은 "goodbye" 라는 리터럴을 가리키고 마치 pstr[] 과 같은 것이다. 따라서 printf("%s", pstr) 의 결과값이 제대로 나오는 이유는 arr[] 에서 arr 와 &arr[] 이 동일함과 원리가 같다고 보면된다.
그런데 리터럴의 조건은 소스 코드 상에서 고정된 값을 가지는 것들이다. 따라서 실제 프로그램 실행 중에도 리터럴의 값은 절대로 변경 되서는 안된다. 따라서 리터럴이 보관되는 곳은 오직 읽기만 가능한 곳이 된다. 만일 이곳을 함부로 변경하려고 하는 시도가 있다면 프로그램이 강제로 종료된다.
### 참고 ###
visual studio 2017 이상에서는 리터럴을 char * 가 가리킬 수 없다. 반드시 const char* 가 가리켜야 하며 덕분에 리터럴을 수정하는 것을 코드단에서 방지할 수 있다.
| scanf 의 원리 및 오류 상황에 대한 이해 (2) (0) | 2022.01.30 |
|---|---|
| scanf 의 원리 및 오류 상황에 대한 이해 (1) (0) | 2022.01.30 |
| c 언어 " " 와 ' ' 의 차이점 및 문자열 (0) | 2022.01.27 |
| 함수 포인터 설명 (0) | 2022.01.27 |
| 포인터 swap (**pa, **pb) (0) | 2022.01.26 |
댓글 영역