로그인 바로가기 하위 메뉴 바로가기 본문 바로가기
난이도
입문

모두를 위한 컴퓨터 과학 (CS50 2019)

임시 이미지 David J. Malan (데이비드 J. 말란)
http://www.boostcourse.org/cs112/forum/122690
좋아요 15203 수강생 32899

해당코드의 23행과 29행이 이해되지 않습니다.

int array는 4byte단위로 주소가 지정되기 때문에 \0로 구분할 필요가 없죠.

int list[3]; 로 배열 선언시 메모리에 4바이트단위의 3칸의 공간이 할당되고, 각 방은 index(번호)를 붙여서

list[0], list[1], list[2]로 구분됩니다. 

list[4]는 당연히 존재하지 않기 때문에, 위 코드에서 보시다 싶이 오류가 발생하여 //(코멘트)처리하였습니다.


그런데 왜 23행의  &list[3]는 되고 29행의 list[3]은 되지 않는지 궁금하네요.

애초에 list[3]은 존재하지 않으니 23행도 실행되어서는 안되지 않나요?

&list[3]이 존재하고 이것이 만약에 \0이고 따라서 주소값이 있다고 가정해서 코드가 실행된다고 하면,

29행에서 list[3]의 값을 구할때 \0를 도출하거나, \0를 도출할 수 없다는 에러가 나와야 하는데,

29행 실행시 컴퓨터는 저에게

" list 배열은 index가 0, 1, 2 밖에 없는데 너는 배열의 범위를 넘어가는 index 3을 호출했으니 오류야. " 라고 말하는데 뭐가 문제인지 모르겠습니다.

해당강의 7분 15초까지 보다가, 갑자기 궁금해서 이것저것 만져보다가 이지경까지 와버렸네요...


+ 반복문을 사용할 경우 배열의 범위를 벗어났음에도 주소가 표기되네요. 점점 아리송해집니다.

<입력>

for(int i = 0; i < 5; i++)
{
printf("address of list[%i] = %p\n", i, &list[i]);
}

<결과>

address of list[0] = 0x1b2f2a0
address of list[1] = 0x1b2f2a4
address of list[2] = 0x1b2f2a8
address of list[3] = 0x1b2f2ac
address of list[4] = 0x1b2f2b0