c에서의 3가지 문자열 타입
c에서 문자열 끝에는 \0 이라는 끝을 표시하는 null charater을 넣어줘야 한다
하나하나 넣기에는 불편하므로 c 에서는 편리한 기능을 제공하는데 이는 str[] = 'abcde'와 같이 선언할 경우 자동으로 문자갯수 + 1 개 크기의 문자열 배열을 만들어준다
str[] 변수는 만들어진 공간의 첫 주소를 가리키는 포인터 변수(주소 변경 불가)라고 말한 적이 있었는데 *str도 마찬가지로 주소를 가질 수 있는 포인터(주소 변경 가능)이다
str[] = 'abc' 와 *str = 'abc' 의 차이점은
str[]로 선언할 경우 str[1] = 'c' 와 같이 문자의 변경이 가능하지만 *str로 선언할 경우 문자의 변경이 불가능 하고 이를 string literal 이라고 부른다
이것은 c에서 나타나는 '특이한' 것이기 때문에 암기할 수 밖에 없다
\0을 표기 안해줄 경우
보이는 것 처럼 c 에서 \0을 통해 문자열의 끝을 알려주지 않으면 이상한 문자가 출력된다
문자열을 담는 배열
위와 같은 경우에 words를 어떻게 선언해야 할까?
그 답은 char * words[100]이다 (100은 임의의 숫자로 의미가 없다)
먼저 각각의 words 칸들이 가져야 할 값은 문자열 배열들의 첫 주소이다, 즉 포인터 배열이어야 한다는 것이다
그리고 우리가 포인터를 선언할때 앞에 적는 타입(int,char etc...)은 그 포인터가 가리키는 주소의 값의 타입을 의미한다는걸 기억하면 여기서 포인터가 가리키는 문자열 배열의 첫 주소의 값은 문자이기 때문에 char으로 선언해야 한다는 것이다
그리고 이때 문자열을 받아서 각각의 포인터에 담으려면 문자열을 복사해서(새로운 배열에 담아서) 이 주소를 넘겨줘야 한다
이를 쉽게 하기 위해서 strdup 이라는 함수가 있는데 이 함수의 작동 원리를 자세히 보면 다음과 같다
즉 malloc을 통해 필요한 크기만큼 새롭게 할당을 해주고 할당한 공간에 문자열을 복사해주고 이 배열의 주소를 반환하는 함수인 것이다
이런 방식을 통해야만 문자열을 담은 포인터 배열 words를 구성할 수 있다
'자료구조(data structure)' 카테고리의 다른 글
권오흠 교수님의 자료구조 1강 (C언어 기초 문법 리뷰 - 배열, 포인터, 문자열, 동적메모리할당) (0) | 2023.08.11 |
---|