C 언어에서 발생하는 "malloc(): invalid size (unsorted)" 에러의 원인과 해결 방법을 설명합니다. 이 글에서는 문제 상황과 원인을 자세히 살펴보고, 해결 방법을 단계별로 설명합니다.
문제상황
에러가 발생한 코드:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int a;
int b;
} SampleStruct;
int main() {
int n = 10;
SampleStruct *arr = (SampleStruct *) malloc(n * sizeof(SampleStruct));
for (int i = 0; i <= n; i++) {
arr[i].a = i;
arr[i].b = i * 2;
}
for (int i = 0; i <= n; i++) {
printf("arr[%d]: a = %d, b = %d\n", i, arr[i].a, arr[i].b);
}
free(arr);
return 0;
}
위 코드는 SampleStruct 타입의 구조체 배열을 동적 메모리 할당을 통해 생성하고, 각 요소에 값을 할당한 후 출력하는 예제입니다. 하지만 이 코드를 실행하면 다음과 같은 에러가 발생합니다.
에러로그 내용:
malloc(): invalid size (unsorted)
Aborted (core dumped)
원인분석
"malloc(): invalid size (unsorted)" 에러는 주로 동적 메모리 할당 과정에서 크기를 잘못 지정하거나, 할당한 메모리 범위를 넘어서 접근할 때 발생합니다. 코드를 자세히 살펴보면, for 문에서 배열의 인덱스가 범위를 벗어나게 되는 문제가 있음을 알 수 있습니다.
배열은 0부터 시작하여 (n - 1)까지의 인덱스를 가집니다. 하지만 위 코드에서는 i <= n이라는 조건을 사용하여, 인덱스가 n인 배열 요소에 접근하려고 시도하고 있습니다. 이로 인해 할당된 메모리 범위를 벗어난 곳에 접근하게 되어 에러가 발생합니다.
해결방법-인덱스 조건 수정
에러가 수정된 코드+ 수정된 부분에 대한 주석:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int a;
int b;
} SampleStruct;
int main() {
int n = 10;
SampleStruct *arr = (SampleStruct *) malloc(n * sizeof(SampleStruct));
for (int i = 0; i < n; i++) { // 수정된 부분: i <= n에서 i < n으로 변경
arr[i].a = i;
arr[i].b = i * 2;
}
for (int i = 0; i < n; i++) {
// 수정된 부분: i <= n에서 i < n으로 변경
arr[i].a = i;
arr[i].b = i * 2;
}
for (int i = 0; i < n; i++) { // 수정된 부분: i <= n에서 i < n으로 변경
printf("arr[%d]: a = %d, b = %d\n", i, arr[i].a, arr[i].b);
}
free(arr);
return 0;
}
해결된 코드의 작동원리를 각각 단계별로 설명:
- 동적 메모리 할당을 통해 SampleStruct 타입의 구조체 배열을 생성합니다.
- 수정된 for 문 조건에 따라, 배열 인덱스 범위 내에서 각 요소에 값을 할당합니다. 이렇게 하면 메모리 범위를 벗어난 접근이 발생하지 않습니다.
- 수정된 for 문 조건에 따라, 배열 인덱스 범위 내에서 각 요소의 값을 출력합니다.
- 메모리를 해제하고 프로그램을 종료합니다.
이제 수정된 코드를 실행하면 에러 없이 원하는 결과를 얻을 수 있습니다.
참고링크
728x90