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 |