앞서서 char 배열 널 값 초기화 할 때에
만약 char str[5]="1234"; ( 12345 넣으면 안된다. 널 값이 들어갈 1자리는 비워둬야 된다.)
이렇게 되어있었다고 치자, 여기서 strlen(str) 하면 4가 나올 것이다.
str[0]='\0' 하면 str의 첫 부분이 널값으로 취급하여서 모두 다 널 값 초기화가 되는 줄 알았다. 실제로 strlen(str)를 하면 0이 나온다. 그런데 만약 이 부분은 str[0]='5' 로 바꾸면 다시 strlen(str)은 1이 아니라 4가 나오게 될 것이다.
디버깅 해서 보았더니 str[0]='\0'를 하면 모두 널이 되는 것이 아니라 str[0]의 위치만 임시방편으로 널 값이 되어있었다.
이 부분을 풀어주니 str 1,2,3 부분은 다시 각각 "2" "3" "4" 값을 가지는 것으로 되어 strlen 값이 4가 나오는 것이다.
따라서 널 값 초기화를 해주고 싶을 때에는 for문을 돌려 순차적으로 널 값을 초기화 시켜주자.
초기화가 안된 char str[5] 이 있다고 하자. 이 경우 strlen 값을 하면 완전히 상상 밖의 값이 나온다. 이 이유는 strlen 은 순차적으로 널 값이 나올 때 까지 찾고 널 값을 마주치면 그곳에서 문자 길이를 계산한다. 따라서, 안에 들어가 있는 쓰레기값에 널 문자가 없다면 다른 메모리 영역을 침범해서 널 문자가 나올 때 까지 탐색하기 때문에 예상된 값이 아닌 다른 값이 나오게 된다.
char 배열의 널값 초기화는
char s[4]={0} / {0,} / {} / "" 렇게 있다. 0, 이 일반적이다.
{1} 이나 {1,2} 등등은 앞에서부터 채우고 나머지는 \0 으로 채워넣게 된다.
'공부 기록들' 카테고리의 다른 글
19.11.13 (priority queue, deque) (0) | 2019.11.13 |
---|---|
19.11.05 (근황 토크, 팩토리 패턴) (0) | 2019.11.05 |
19.10.20(C++ 스택, string 입력 받기) (0) | 2019.10.21 |
19.10.19(boj1541) (0) | 2019.10.19 |
19.10.16 (boj2217, char배열 널 값 초기화) (0) | 2019.10.17 |