inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

홍정모의 따라하며 배우는 C언어

0.6 컴퓨터 메모리의 기본 구조

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

832

궁금이

작성한 질문수 49

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문을 하나 더 쓰는 둥 깔끔하게 되지 않습니다.

가르쳐 주실수 있나요.

c

답변 1

0

안소

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

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] 라고 적으면 안됩니다. 

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

0

궁금이

감사합니다.

완전히 똑같이 따라해도 exe파일이 안만들어져서 실행이 안됩니다.

1

43

3

main 함수에서 왜 int만 선언이 되는걸까요

1

51

2

8비트 2진수 변환시 왜 1을 더해야하나요?

1

52

2

혹시 강의를 빠르게 수강하려면 어디서부터 듣는게 좋을까요?

1

46

1

프로토타입과 함수간의 인자 불일치

1

72

2

12.12 헤더 관련 질문

1

59

2

Visual Studio Community 2026 사용 문의

1

132

2

Q. 15:30, 부호가 있는 8비트 정수 질문

1

59

2

getchar(), putchar()

1

92

3

강의자리ㅛ

1

78

2

비주얼스튜디오코드로 공부해도 상관없나요?

1

112

2

소스파일안에 여러 파일

1

74

2

F5와 F7의 차이

1

75

2

c = TWO * (a+b); 에서 a와 b는?

1

58

2

; 세미콜론을 붙이는 기준에 문의

1

68

1

Step over 기능 문의

1

52

2

2.6 강의 따옴표 출력 규칙 문의

1

74

2

int main 함수 관련 오류 문의

1

67

2

13.4 words[0]

0

60

2

11.7 함수를 구현해 봤습니다.

1

62

2

11.6 직접 strcmp와 strncmp를 구현해 보았습니다.

1

64

2

11.6 my_strcat과 my_strncat을 구현해봤습니다.

1

53

2

11.6 fit_str함수를 구현해 봤습니다.

1

53

2

11.5 코드 구현

1

66

2