내가 몇 가지 코드를 읽어 봤는데으로 초기화 나는 다음과 같은 발생 배열, 문자열 null 암시 적으로 종료되어야합니다 오른쪽? 이 경우 어떻게됩니까? 컴파일러가 문자열 리터럴에서 '\ 0'을 인식하고 null 종결 자로 지정합니까? 또는 int 번호로 오버플로됩니까? 이 양식에 문제가 있습니까?명시 적 크기의 문자 배열을 초기화하고 크기보다 더 큰이
답변
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
문자 만이 표준에서 인용 된 위의 명확한 설명과 같이 초기화에 사용됩니다.
코드 인 경우 :
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'
로 설정하는 일, 그래서 괜찮아요하고 문자열입니다.
이것이 C에서 유효하다는 것을 몰랐고, C++에서는 유효하지 않다. +1 by –
@Marco 예, 이것은 C와 C++의 차이점 중 하나입니다. 동일한 코드가 C++에서 유효하지 않습니다. –
흥미 롭습니다.이 C++ 코드를 C++ 컴파일러에 이식해야 할 수도 있으므로이 점을 염두에 두십시오. – 9a3eedi
- 1. TypeScript에서 배열을 초기화하고 초기화하고 채우는 방법은 무엇입니까?
- 2. 더 나은, 암시 적 또는 명시 적 조인은 무엇입니까?
- 3. 명시 적 형식 변환
- 4. PHP - 배열을 초기화하고 조건
- 5. 명시 적 시맨틱 분석
- 6. Ember 명시 적 경로
- 7. 하스켈에서 명시 적 재귀
- 8. 명시 적 캐스팅 리턴
- 9. 축소 된 크기의 PNG가 원래 크기보다 큽니다
- 10. 함수에서 문자 배열을 초기화하고 반환하면 주에 잘못된 출력이 발생합니다.
- 11. 명시 적, 인증없이 401
- 12. 가변 크기의 문자 배열을 저장할 배열을 만드는 방법은 무엇입니까?
- 13. ASP.NET : 명시 적 대 암시 적 현지화?
- 14. VB.NET - 암시 적 및 명시 적 트랜잭션
- 15. 이미지가 원래 크기보다 더 커지지 않도록하십시오.
- 16. Ember.js의 명시 적 경로
- 17. 사용하여 명시 적 값
- 18. glDeleteFramebuffers 명시 적 호출
- 19. 명시 적 캐스트가
- 20. 명시 적 의도 - Android
- 21. 명시 적 매개 변수
- 22. 명시 적 키워드
- 23. Arraylists의 명시 적 지정
- 24. 명시 적 인스턴스화는
- 25. JSF 명시 적 탐색
- 26. 명시 적 ObservableCollection 캐스팅
- 27. 명시 적 의도 오류
- 28. 명시 적 템플릿 전문
- 29. 명시 적 종료가 필요합니까?
- 30. 혼란과 명시 적 변환
당신이 정말로 원하는 것은'char str [] = "ABC";' –
입니다. 그렇게 평소대로하는 것이지만 이것은 제 코드가 아닙니다. 나는 다른 사람의 코드를 읽고 있었는데 이것이 나왔다. 그리고 이것이 내가 문제를 일으킬 지 궁금해했다. – 9a3eedi