C에서는 문자열은 문자를 가리키는 포인터이다. 이게 굉장히 중요하면서 헷갈린다.

문자를 가리키는 포인터라면, 주소를 안다면 다음 문자의 주소도 있지 않을까?

 

아래 예제에서 확인해본다.

 

 

문자의 주소(문자열 str 주소) 와 다음 문자 'u', 'n' 의 주소이다.

 

 

맞다. 문자열은 주소이다. 1바이트씩 증가하며 문자를 저장하고 있다.

그럼 당연히 조작도 가능하지 않을까? 라는 생각에 접근하여 문자를 변경해본다.

 

 

두 번째문자 'u' 'o' 변경을 시도했지만 "Segmentation fault" 에러가 나왔다.

잘못된 주소접근? 정도로 해석할 있을 같다. 안될까?

주소로 접근이 가능하고 배열로도 출력이 되는데 수정이 안될까?

 

문자열을 저장하는 메모리영역은 text segment 이다.

배열을 통한 문자열 저장은 stack 이지만, 이 곳은 프로그램의 코드나 변수명이 저장되는 곳이고 read-only 영역이다.

때문에 수정이 불가하고 읽기만 가능한 것이다.

 

포인터변수에 리터럴 초기화는 읽기전용으로만 사용하자.

책에서는 안전하고 명확히 표현하고자 const 곁들여 쓰자고 제안한다.

 

const char* name = "John";

 

'C' 카테고리의 다른 글

매개변수에 전역변수  (0) 2022.05.13
LinkedList  (0) 2022.05.10
shallow & deep copy  (0) 2022.04.27
main(int argc, char** argv)  (0) 2022.04.26
(unsigned int)1 - (unsigned int)2 > 0 ? yes : no  (1) 2022.04.23

+ Recent posts