2011-09-08 3 views
1

저는 C++을 처음 접했고 배열을 사용해야합니다.Visual C++ 6.0 - 배열 범위 오버플로가 발생하는 이유는 무엇입니까?

char arr[2] = "12"; 

을하지만 그것을 변경하는 경우 :

char arr[3] = "12"; 

는 잘하지만 왜 작동 문제는 내가이 줄 오류 "배열 범위 오버 플로우"를 얻을 수있다?

업데이트 :

그리고 이것은

char arr[2] = {'1','2'}; 

나는 그들이 메모리에 저장하는 방법 선언의 차이, 정말 혼란 스러워요 :(작동 C에서

답변

6

. 문자열을 나타내는 메모리 공간 (char arrays)은 null 문자로 끝납니다. \0

따라서 문자열을 저장할 메모리는 쓸 때 예상 한 크기보다 큰 문자 여야합니다. " "

이 예제에서는 문자열을 작성하지 않고 문자 배열을 작성합니다. 표기를 " "에서 { }으로 변경했기 때문에 시스템은 더 이상 null로 끝나는 문자열을 작성하지 않고 사용자가 요청한대로 배열을 작성합니다.

요점은 문자열이 특수하며 시스템에 의해 자동으로 끝까지 붙여 넣기 때문에 추가 공간이 필요하다는 것입니다.

+0

어? 그러나 Borland C++ 4.5를 사용할 때 char arr [2] = "12"; '제대로 작동합니다. 왜 생각하니? 길이에 길이를 더하면 어레이에 어떻게 접근해야합니까? 0부터 시작해야하나요? – dpp

+0

볼랜드의 경우 컴파일러의 버크 - 문자열은 배열이고 0에서 인덱싱됩니다 – zellio

+0

저는 여전히 혼란 스럽습니다. 문자열은 문자 배열이 아닙니까? – dpp

3

char 배열의 모든 문자열 끝에 null 종료 문자 "\ 0"이 있습니다. 이 문자는 항상 배열에 추가 공간을 예약해야합니다.

3

C 및 C++의 리터럴 문자열에는 묵시적 '\ 0'이 붙어 있기 때문입니다. 0으로 끝나는 문자열이라고하며 메모리의 어딘가에 명시 적으로 저장하는 대신 문자열의 길이를 추적 할 때 도움이됩니다.

2

문자열 상수는 문자열 끝에 NUL을 저장해야하므로 2 문자의 저장 공간으로 충분하지 않으므로 오버플로가 발생합니다. '1', '2'및 NUL을 3 자로 저장해야합니다.

관련 문제