인프런 커뮤니티 질문&답변

작성자 없음

작성자 정보가 삭제된 글입니다.

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

6.1 배열 기초 [1 of 2] array

배열에서 링킹에러, 초기화에 대한 질문

작성

·

248

0

Q1.

강의에서 선언된 배열의 범위 밖의 index를 선언하면 링킹에러가 뜬다고 설명하셨는데, 왜 컴파일에러가 아닌 링킹에러가 발생하는건지 궁금합니다.

Q2.

배열을 초기화하지 않고 위 코드를 실행하면,

사진과 같이 -858993460이라는 고정된 값이 출력됩니다. 초기화하지 않으면 쓰레기값이 나오기 때문에, 실행될 때마다 다른 값이 출려될 거라 예상했는데 -858993460라는 수만 출력이 됩니다. 구글링해서 찾아봐도 다른 예시 코드에서도 -858993460만 출력되더라고요. 

이러한 이유가 궁금합니다.

답변 2

1

1.

컴파일 에러 : 컴파일 타임에 알 수 있는 에러. 즉, 실행 전에 알 수 있는 에러.

런타임 에러 : 런타임에 알 수 있는 에러. 즉, 실행 해 봐야 알 수 있는 에러. 

int array[5] 라는 배열이 있다고 했을 때 array[6] 을 참조하는건 컴파일타임엔 이게 에러인지 몰라요.

컴파일 타임은 '주로' 문법을 검사하는 정도에 그칩니다.(정적 메모리를 할당하는 등등 다른 일도 많이 합니다만..!) 컴파일러 입장에서는 array 크기가 5 라는 것을 내내 기억해두고 문법 검사를 하는게 아닌거에요! 그냥 코드 쭉 훑고 내려오면서 검사를 할 뿐입니다. 실제로 array[6] 이 문법에 어긋나는 것도 아니구요! 컴파일타임엔 문법 검사 같은 일을 할 뿐 실제로 array[6] 으로 접근하게 되는 메모리가 '정의'되어 있는 메모리인지 알 수가 없다는거에요.

array[6] 으로 접근하게 되는 메모리가 '정의'되어 있는지 알 수 있는 방법은 직접 실행하는 것 뿐입니다. 그렇기 때문에 런타임에러입니다.

2.

홍재윤님께서 설명해주셨네요 :) 

주로 쓰레기값은 16진수로 cccccccc 거든요! 그게 10진수 정수로 변환하면 저 숫자라서 그렇습니다.

1

저는 강사님과 관련없는 일반 수강생입니다....

윈도우 계산기로 십진수 -858993560를 2진수 32비트로 해보면 1100 1100 1100 1100 1100 1100 1100 1100 나오네요~ 16진수로는 c c c c c c c c 이구요~

-858993460 is 0xcccccccc. It's the bit pattern that MSVC uses to fill uninitialized values in debug builds. This helps you identify cases of uninitialized variables.

참조 :

https://stackoverflow.com/questions/32485095/858993460-being-output-for-an-uninitalized-variable

작성자 없음

작성자 정보가 삭제된 글입니다.

질문하기