• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

arr[-1]의 경우 어떻게 되는지 궁금합니다.

21.04.09 18:08 작성 조회수 464

1

현재 아두이노를 배우고 있는데 이것이 코딩할 때 C언어를 씁니다.

일단은 코드블럭으로 확인해본 결과

이렇게 하면 arr[-1]에 쓰레기값이 나오고, 제대로 0으로 대입도 된다는 것을 확인하였습니다.

그렇다면 arr배열의 바로 그 전의 메모리 공간이라고 추측이 가능한데,

혹시나 컴파일러가 미연의 버그를 방지하기 위해 사용가능 메모리의 제일 앞쪽과 제일 뒷 쪽, 그리고 각 선언한 저장공간들을 띄엄띄엄 해놨는지 궁금합니다.

제가 이런 질문을 한 이유는

pinMode 함수는 그 핀에 전기를 흐르게 할지 말게할지 하는 함수인데 OUTPUT이 출력이 가능하도록 설정해놓는 겁니다.

전역변수로 선언된 switch_pin과 led배열에 들어간 값은 핀 번호입니다.

INPUT_PULLUP은 전류가 흐르냐 안 흐르냐, 흐르지 않다면 전기가 고여있어 1로, 흐른다면 고여있지 않다는 뜻으로 0으로 표시됩니다.

그래서 빵판에 물리적인 스위치를 눌렀을 때 흐르게 되어 1로 됩니다.

setup 함수와 loop함수는 코딩환경을 켜면 main함수처럼 기본 입니다.

digitalRead는 신호를 읽는 것이고, digitalWrite는 디지털 신호를 쓰는 명령입니다.

위의 코드는 스위치를 눌렀을 때마다 차례로 LED가 점등되고, 전에 점등된 스위치를 꺼지게 함으로써 계단처럼 차례로 LED가 점등되는 코드입니다.

일단은 위 코드는 문제없이 작동을 하였습니다.

그런데 먼저 말한 궁금증

컴파일러가 미연의 버그를 방지하기 위해 사용가능 메모리의 제일 앞쪽과 제일 뒷 쪽, 그리고 각 선언한 저장공간들을 띄엄띄엄 해놨는지 궁금합니다.

가 아닐 경우는 버그가 발생할 지도 모릅니다.

그러나 arr[-1]을 쓸 경우 위처럼 정말로 간단하고 짧게 코딩이 가능한데, 그렇지 않을경우 if문을 하나 더 쓰는 둥 깔끔하게 되지 않습니다.

가르쳐 주실수 있나요.

답변 1

답변을 작성해보세요.

0

안소님의 프로필

안소

2021.04.09

안녕하세요. 답변 도우미입니다 :)

arr[-1]은 arr배열의 바로 그 전의 메모리 공간 맞습니다.

컴파일러가 미연의 버그를 방지하기 위해 사용가능 메모리의 제일 앞쪽과 제일 뒷 쪽, 그리고 각 선언한 저장공간들을 띄엄띄엄 해놨는지 궁금하다고 말씀해주셨는데 이웃 하지 않고 띄엄 띄엄 떨어져있냐고 말씀하신 것으로 이해했는데 맞을까요?

그렇진 않습니다. 메모리는 모두 "연속적"입니다. 다 따닥 따닥 이웃사이로 붙어있어요. 그래서 arr[-1] 을 하게 되면 그 이전의 4 칸 (4byte) 공간에 접근하게 되네요. 즉, 바로 앞 칸이나 마찬가지이죠!

위 사진은 arr[-1] = 0; 를 하기 전 모습입니다. 빨간색 상자가 arr 배열의 원소들이에요. (한 칸당 1byte입니다.)

 

arr[-1] = 0 을 진행하니 arr 원소들 바로 앞에 있는(바로 왼쪽에 있는) 4 byte 공간이 쓰레기값에서 0 으로 수정 되는 것을 확인할 수 있네요. (cccc 👉 0000)

arr[-1] 을 하면 바로 이전 공간에 0 이 잘 대입되긴 하지만 결과적으로는 arr라는 배열의 범위에서 벗어난 공간을 접근하는 행위이기도 합니다. 그래서 실행시키면 이렇게 런타임 에러가 발생하게 됩니다. arr[-1]에 0 이 대입되긴 하지만 정상적인 프로그램이라고 보지 못하는 것이에요! 그러니 arr[-1] 라고 적으면 안됩니다. 

질문 주신 내용이 강의와 관련된 내용이 아니기도 하고 제가 아두이노에 대한 지식이 전무해서 질문자님의 글에 완벽히 답변을 드릴 순 없지만 "각 선언한 저장공간들을 띄엄띄엄 해놨는지" 라고 말씀하신 것에 이렇게 답변을 드립니다.

궁금이님의 프로필

궁금이

질문자

2021.04.10

감사합니다.