2014-04-18 3 views
2

내가 몇 가지 코드를 읽어 봤는데으로 초기화 나는 다음과 같은 발생 배열, 문자열 null 암시 적으로 종료되어야합니다 오른쪽? 이 경우 어떻게됩니까? 컴파일러가 문자열 리터럴에서 '\ 0'을 인식하고 null 종결 자로 지정합니까? 또는 int 번호로 오버플로됩니까? 이 양식에 문제가 있습니까?명시 적 크기의 문자 배열을 초기화하고 크기보다 더 큰이

+0

당신이 정말로 원하는 것은'char str [] = "ABC";' –

+0

입니다. 그렇게 평소대로하는 것이지만 이것은 제 코드가 아닙니다. 나는 다른 사람의 코드를 읽고 있었는데 이것이 나왔다. 그리고 이것이 내가 문제를 일으킬 지 궁금해했다. – 9a3eedi

답변

3

C99 표준 § 6.7.8. ¶ 14 문자 유형

배열 임의로 중괄호 리터럴 문자열 의해 초기화 될 수있다 말한다. 문자열 문자열 리터럴의 연속 문자 ( 에 공간이 있거나 배열 크기를 알 수없는 경우 종료 문자 포함)는 배열의 요소를 초기화합니다.

이것은 다음 내용이 동일하다는 것을 의미합니다.

char str[4] = "ABC\0"; 
// equivalent to 
char str[4] = "ABC"; 
// equivalent to 
char sr[4] = {'A', 'B', 'C', '\0'}; 

위의 첫 번째 문구에는 아무런 문제가 없습니다. 표준에 명시 적으로 명시된 바와 같이, 문자열 리터럴의 많은 문자 만이 배열의 크기로 배열을 초기화하는 데 사용됩니다. 리터럴 문자열 "ABC\0"에는 실제로 5자를 포함합니다. '\0'은 어떤 문자와도 같으므로 좋습니다.

그러나 "ABC\0" 리터럴 문자열이 5 문자를 포함하고 배열 str의 크기가 지정되지 않은 경우 모든 문자가 str의 초기화에 사용되기 때문이다

char str[4] = "ABC\0"; 
// equivalent to 
char str[4] = {'A', 'B', 'C', '\0'}; 


char str[] = "ABC\0"; // sizeof(str) is 5 
// equivalent to 
char str[] = {'A', 'B', 'C', '\0', '\0'}; 

사이에 차이가 있음을 유의하시기 바랍니다. 이와 대조적으로, str의 크기가 4으로 명시 적으로 명시된 경우 "ABC\0" 문자의 첫 번째 4 문자 만이 표준에서 인용 된 위의 명확한 설명과 같이 초기화에 사용됩니다.

+1

좋은 답변입니다. 감사! 동등한 도움이 내게 많은 도움이됩니다 – 9a3eedi

+0

"ABC \ 0"은 5자를 어떻게합니까? 한 문자는 "\ 0"입니까? 또는 "\ 0"두 문자가 이니셜 라이저에 있습니까? – 3366784

+0

문자열은 null로 끝나는 상수 문자 배열입니다. 따라서 문자열 자체의 일부인'\ 0'을 제외하고 null을 가진 문자열을 종료시키는 다른 '\ 0'이 있습니다. – ajay

6

코드 인 경우 :

char str[3] = "ABC"; 

그것은 C에서 잘하지만 그것은 null로 끝나는 아니기 때문에 문자 배열 str 문자열이 아닙니다. 자세한 내용은 C FAQ: Is char a[3] = "abc"; legal? What does it mean?을 참조하십시오. 당신의 예에서

:

char str[4] = "ABC\0"; 

배열 str의 마지막 문자가 '\0'로 설정하는 일, 그래서 괜찮아요하고 문자열입니다.

+0

이것이 C에서 유효하다는 것을 몰랐고, C++에서는 유효하지 않다. +1 by –

+2

@Marco 예, 이것은 C와 C++의 차이점 중 하나입니다. 동일한 코드가 C++에서 유효하지 않습니다. –

+0

흥미 롭습니다.이 C++ 코드를 C++ 컴파일러에 이식해야 할 수도 있으므로이 점을 염두에 두십시오. – 9a3eedi