2011-06-13 7 views
0

다음 스 니펫에서 의심의 여지가 있습니다. 사실 나는 모든 배열 인덱스를 다음 코드에서 0으로 초기화하고 있지만이 for 루프는 무한하게 진행됩니다. 우리가 배열의 26 번째 인덱스에 액세스하려고 시도하는 이유를 발견했습니다. 그래서 0에서 25 개의 인덱스가 있으므로 값은 다시 0으로 초기화됩니다. 따라서 for 루프는 무한히 진행됩니다. 이 물건 뒤에 실제 이유가 있는지 설명하십시오.배열의 정수 인덱스 증분

int array[26]; 
int i; 
for (i = 0; i <= 26; i++) 
    array[i]= 0; 

답변

10

i < 26; 그렇지 않으면 배열 범위를 초과합니다.

대부분의 시스템에서 스택의 레이아웃으로 인해 array[26]i에 사용 된 메모리를 가리키고 있으므로 루프 본문은 적절한 배열 요소 대신 i를 0으로 설정하므로 루프가 다시 시작됩니다. 당신은 단순히 모든 요소를 ​​가진 배열을 만들 수 int array[36] = { 0 };을 사용할 수 있습니다

참고 어쩌면 i가 메모리에 array 뒤에 위치 0

+0

우리가 인덱스를 초과하는 경우, 그 인덱스 값이 아닌 내가 값을 변경하는 가정합니다. 그것은 매우 약화 된 것 같습니다. 어떤 신체가 무의식적으로 초기화하지 않는 다른 목적으로 사용하는 경우. 그것은 커다란 피해를 줄 수 있습니다. – Pavunkumar

+0

배열 외부의 메모리 위치에 쓸 수 있습니다. 분명히이 위치에 * something *이 있습니다 - 그리고 제가 말했듯이, 보통 배열 뒤에 정의 된 var입니다. – ThiefMaster

+1

@pavun_cool : 네, 큰 피해를 줄 수 있습니다. 버퍼의 끝에 지나지 않도록주의해야합니다. 이것은 소프트웨어 세계에서 엄청난 수의 버그가 발생했는데, 그 중 일부는 우주 로켓을 폭발 시켰습니다. 저수준 프로그래밍에 오신 것을 환영합니다. –

1

로 설정 되 고 루프에 0i=26을하게된다. 나는. &array[26] == &i.

0

배열의 26 번째 색인에 액세스하려는 이유가 발견되었으므로 0에서 25 개의 색인이 있으므로 값이 다시 0으로 초기화됩니다. 따라서 for 루프는 무한히 진행됩니다.

이유는 i 변수 루프가 26포함0에서가는 것입니다. 그러나 은 없습니다. array[0] ~ array[25] (총 26 개 요소) 만 있습니다.

array[26]에 작성하여 정의되지 않은 동작을 호출하고 있습니다. 그것 그냥 실행i은 메모리에 array 직후에 배치되었고 실수로 작성한 0i으로 작성했습니다. 이로 인해 무한 루프가 발생할 수 있습니다.

대신 쓰기 :

int array[26]; 
int i; 
for (i = 0; i < 26; i++) { 
    array[i] = 0; 
} 
관련 문제