2014-10-05 5 views
0

우리는 c가 문자 배열의 끝에 자동으로 NULL (\ 0)을 삽입한다는 것을 알고 있습니다. 그러나 문자열에 대한 포인터 배열의 끝에 NULL 문자를 삽입하지 않는 이유는 무엇입니까?문자열에 대한 포인터 배열

Eample를 들어

: 내가

char name[]={40,20,30,20,22,22,'c','a','b'} 

쓰기하면 NULL 문자가 자동으로 추가됩니다. 내가 유형이 숯불 예를 들어 배열 의 끝에 널 문자를 추가하지 않습니다 포인터의 배열을 생성하지만

char *names[]={"aaa","bbb","cccc"} 
+1

아니요, 처음 부분이 사실이 아니기 때문에 그 사실을 전혀 모릅니다. 어쨌든, 당신의 질문은 무엇입니까? – juanchopanza

+0

문자 배열과 문자열 사이에 차이가 있습니다. – haccks

+0

문자열 상수는 NUL.for에 의해 종료되는 1 차원 문자 배열입니다. 예 char name [] = { 'H', 'A', '\ 0'}; @haccks – Walter

답변

2

C는 은 문자 배열 (또는 다른 배열을 위해 그렇게하지 않습니다 그 문제), 그것은 "xyzzy" 같은 문자열 리터럴에 대한 않습니다. ISO C 표준의 관련 비트 C11 6.4.5 String literals /7 :

번역 단계 7은 값 0의 바이트 또는 코드 문자열에서 문자 또는 리터럴 결과 각 멀티 문자 시퀀스에 추가된다. 그런 다음 멀티 바이트 문자 시퀀스를 사용하여 정적 저장 기간 및 길이의 배열을 초기화하는데 사용합니다. 시퀀스를 포함하기에 충분합니다.

문자열 리터럴의 경우 배열 요소는 char 유형이며 멀티 바이트 문자 시퀀스의 개별 바이트로 초기화됩니다.

이유 당신이 문자열이 널 (null) 종료 할 알고 있기 때문에이 그렇지 않으면 전혀 실제로 C의 문자열이 아닌 것입니다 않습니다.

당신이이 아닌 문자열 리터럴 문자 배열 name의 끝에 터미네이터를 찾는 일이 할 경우, 그것은 순수한 우연의 일치 그리고 그것은에 의존하는 것은 정의되지 않은 동작의 영역으로 잘.

3

이해가 잘못되었습니다. 당신은 Eample를 들어

말했다 : 내가

char name[]={40,20,30,20,22,22,'c','a','b'}

작성하는 NULL 문자가 자동으로 추가됩니다.

사실이 아닙니다.

당신이 사용하는 경우 :

널 종료 문자가 아니라 당신이 사용하는 형태로 추가
char name[] = "abc"; 

.