c 질문있어요! 쉬우시겠지만 조금 봐주세요! EXC_BAD_ACCESS

조회수 519회
#include <stdio.h>

int main(void) {
    int aList[5] = {40, 20, 30, 40, 50};
    int nMax = aList[0];

    for(int i=0; aList[i] != '\n'; i++) {
        if(nMax < aList[i]) nMax = aList[i];
    }

    printf("MAX: %d\n", nMax);
}

안녕하세요! 이번에 c를 새로 공부하고 있는 코린이 입니다!

배열을 공부하는데 여기 for문에서 에러가 났어요!

(배열속 숫자중 최댓값을 구하려는 거예요!)

Thread 1: EXC_BAD_ACCESS (code=1, address=0x7ffeefc00000) 

라는데요.

aList[i] != '\n' 이 부분을 보고 그런거같은데, 왜 이게 에러가 되는지 모르겠어요. 단순히 (i < 5) 라고 해도 되겠지만 조금더 좋게 만들려고 이렇게 하려는데, 에러난 이유가 어떤건지 알려주세요.

  • '\n'은 줄바꿈을 나타내는 값인데요. 어떤 방식으로 값을 읽느냐에 따라서 '\n'이 얻어질수도 있고, 아닐수도 있습니다. 그런 것은 차차 공부해 나가시면서, 아니면 일하면서 알게되실거에요. 예를 들어, gets 함수로 문자열을 입력받게 되면 문자열 맨뒤에는 \n이 없고요. fgets 함수로 파일의 한문장을 읽어오게 되면 맨 마지막에 \n이 붙어 있습니다. 이런 거까지 다 아는 사람은 굉장히 드물구요. 그냥 그때그때 내가 지금 하고 있는 함수나 입력 방법에서 \n이 마지막에 추가되었는지 안추가되었는지 간단히 체크한후에 그것에 맞춰서 코딩하면 됩니다. 알 수 없는 사용자 2020.8.27 17:44
  • i < 5도 나쁜 코드가 아닙니다만, 배열의 크기를 자동으로 감지하길 원한다면 i < sizeof(aList)/(sizeof(aList[0]))으로 바꿔서 하는 경우가 종종 있습니다. 질문에서의 코드대로라면 sizeof(aList)는 전체 메모리 크기인 4바이트 x 5=20이고, sizeof(aList[0])은 aList[0]가 차지하는 공간인 4바이트라서 결국 sizeof(aList)/(sizeof(aList[0]))=20/4=5로서 배열의 크기가 얻어집니다. 계속 열심히 공부하길 바래요. 행운을 빌어요. 알 수 없는 사용자 2020.8.27 17:47
  • 알고싶었던 부분을 정확히 알려주셔서 너무 감사해요 ㅠㅠ! > 0 < 알 수 없는 사용자 2020.8.27 18:10

1 답변

  • i<5i5가 되면 거짓이 됩니다. 그래서, 4까지 돌고 종료가 되죠.

    aList[i] != '\n'i가 아무리 증가해도 계속 입니다. i가 계속 증가하게 됩니다. aListaList[4]까지만 준비되어 있고, 그 이상은 준비되어 있지 않습니다. 그래서, 디버그빌드에서는 aList[5]가 되어, 그 내용을 읽으려는 순간에, 지정한 배열의 크기를 넘어서 접근했기 때문에, BAD_ACCESS 라는 에러가 발생했을 겁니다.

    • 배열의 맨 마지막은 \0 으로 채워진다고 들었는데 그건 문자형 배열일때만 해당되는건가요??? 알 수 없는 사용자 2020.8.27 17:37
    • 1. 네. 문자열만 그래요. 2. '\0' 과 '\n' 은 다른거에요. nowp 2020.8.28 09:29
    • 감사합니다!!!! >.< 알 수 없는 사용자 2020.9.2 16:59

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)