dlqudgus2587   4년 전

오랜만에 술술 풀리나 싶더니 런타임 에러가 뜨네요..

행렬을 입력 값에 맞춰 동적 할당을 한 후 요소들을 입력받고, 곱셈을 한 결과를 담는 행렬도 동적 할당을 해서(N*K) 그 행렬을 출력하는 코드로 짰는데 런타임에러가 나왔습니다.

런타임에러가 나오면 보통 배열의 경계가 문제라고들 하셔서 나름 유심히 봤는데 잘 모르겠네요ㅠㅠ 어느 부분에서 틀린걸까요..

그리고 런타임에러가 뜨면 저는 배열의 길이를 넘어가는지만 확인해보는데 다른 점검해야 할 요소가 있나요??

마지막으로, 다른 분들 질문 글을 보니까 문제에서 N,M,K가 100을 안넘는다고 해서 처음부터 A[100][100] 이런식으로 선언을 하시던데 제 생각에는 만약 N,M,K가 값이 작을 때에는 남은 공간이 낭비?된다고 생각해서 입력받은 N,M,K 값에 맞게 동적할당 하는 방식을 사용했는데, 어떤 방법이 더 나은 코드인가요?

쓰다보니까 질문이 좀 많네요ㅠㅠ 선배님들 답변 부탁드립니다. 감사합니다.

djm03178   4년 전

A, B, C 자체가 할당받아야 하는 것은 int의 배열이 아니라 int *의 배열입니다. 즉, A[0]도 int *이고, B[3]도 int *이고, C[4]도 int *이지, int가 아닙니다. int인 것은 A[0][0], B[1][3], C[4][2] 등입니다.

따라서 malloc으로 할당해주는 크기도 sizeof(int)가 아니라 sizeof(int *)이 되어야 합니다.

djm03178   4년 전

런타임 에러라는 건 프로그램이 해서는 안 되는 동작이라면 어느 것이든 발생 원인이 될 수 있습니다. 배열 크기를 넘어가는 것이 가장 자주 하는 실수일 뿐, 정상적이지 않은 동작을 유발할 수 있는 문장이라면 무엇이든지 다 체크해봐야 합니다.

처음부터 배열 크기를 고정하는 것보다 동적 할당을 하는 것이 크기가 작은 입력에서는 메모리의 이득이 될 수 있으나, 문제 풀이에서는 크게 의미가 없습니다. 문제 풀이에서는 무엇이든 항상 '최악의 경우'만이 중요하고, 크기가 작은 입력에서 아무리 이득을 본다고 해도 결국 크기가 큰 입력에서 이득이 없다면 둘은 똑같기 때문입니다. 게다가 동적 할당이라는 것은 동적 할당 그 자체에 시간적인 오버헤드가 있을 뿐 아니라 포인터를 그만큼 더 할당받기 때문에 최악의 경우에는 오히려 메모리를 더 많이 사용하게 됩니다. 메모리의 집약성도 보장되지 않아 캐시 미스율 또한 증가할 수 있습니다. 그래서 문제 풀이에서는 일반적으로 전역에 고정 크기의 배열을 박아두는 것이 더 선호됩니다.

dlqudgus2587   4년 전

@djm03178님 답변 감사합니다ㅎㅎ

질문이 많았는데 하나하나 잘 답변해주셔서 너무 감사합니다ㅠㅠ

결국 안좋은 아이디어를 떠올리고 심지어 제대로 적용도 못한 꼴이 됐네요..허허

런타임 에러는 제 수준에서는 배열 크기를 넘어서는 것 말고 다른 부분 체크는 좀 힘드네요ㅠㅠ 디버깅 했을 때도 딱히 문제점을 찾지 못했는데... 더 공부해보겠습니다. 답변 정말 감사드립니다.

댓글을 작성하려면 로그인해야 합니다.