문자열 배열과 포인터의 초기화에 대한 질문입니다.

ktd2004의 이미지

먼저 질문을 드리기 전에 제가 알고 있는 내용을 적어보겠습니다.

1번 코드

char a[6] = "12345";

- 스트링의 끝에 NUL이 자동으로 추가되는지요?
- 배열 a의 데이타의 수정은 가능한지요?

2번 코드

char a[] = "12345";

- 이 경우에는 스트링의 끝에 NUL이 자동으로 추가되는지요?
( sizeof(a)는 6으로 출력됩니다.)
- 배열 a의 데이타의 수정은 가능한지요?

3번 코드, 전혀 문제없는 코드.

char a[6];
strcpy( a, "12345");

4번 코드. 전혀 문제없는 코드

char *a;
a = (char*)malloc(6);
strcpy( a, "12345");
...
free(a);

5번 코드.

char *a = "12345";

포인트 a의 값을 수정할 수 없다.
따라서 const char *a = "12345" 식으로 초기화하는 것이 낫다.

6번 코드.

char *a;
strcpy( a, "12345");

메모리가 할당되지 않았음. 잘못된 코드.

제가 궁금하게 생각하는 부분은 1,2,3번의 경우입니다.
즉, 배열을 다음과 같이 초기화 했을 때.

char a[] = "12345";

- 끝에 NUL이 추가되는지? (추가됨)
- 수정이 가능한지? (가능함.)
- sizeof(a)의 결과는? (6)

이런 경우에는

char a[] = {'1','2','3','4','5'};

- 끝에 NUL이 추가되는지? (추가되지 않음)
- 수정이 가능한지? (가능함)
- sizeof(a)의 결과는? (아마 5)

그럼 답변 부탁드리겠습니다. 즐거운 주말되시기를...

cinsk의 이미지

먼저 null character는 '\0'로 표기합니다. (참고로 NUL은 ASCII code에서
0번 control character를 가리키는 표현입니다. C 언어에서 NUL이란 용어는 쓰지 않습니다. 어차피 수치로는 같은 0이긴 하지만..) 따라서 '\0' 또는 그냥 널 문자(null character)라고 쓰기 바랍니다.

Quote:

char a[6] = "12345";

- 스트링의 끝에 '\0'이 자동으로 추가되는지요? 예.
- 배열 a의 데이타의 수정은 가능한지요? 예
Quote:

char a[] = "12345";

- 이 경우에는 스트링의 끝에 '\0'이 자동으로 추가되는지요? 예
( sizeof(a)는 6으로 출력됩니다.)
- 배열 a의 데이타의 수정은 가능한지요? 예
cinsk의 이미지

참고로

char a[5] = "abcde";

의 경우, '\0'이 자동적으로 붙지 않습니다. (즉, 올바른 문자열이 아닙니다.) 당연 sizeof(a)는 5입니다.

char a[5] = "abcdef";

경우도 '\0'이 자동적으로 붙지 않고, 이 경우는 경고(또는 에러)가
발생합니다. 초기값으로 준 문자열 상수(string literal)가 배열의 크기보다 더 크기 때문입니다.