int와 long long에 따른 malloc memory corrupt
안녕하세요
복잡한 것도 아니고, 동생이 공부하는 걸 도와주다가 원인을 모르는 메모리 오염이 발생했다하여 질문드리고 싶습니다.
#include <stdio.h> #include <stdlib.h> #define divider 100007 int main() { int k, n, idx; long long *arr; scanf("%d %d", &k, &n); arr = (long long*)malloc(sizeof(long long) * n); for(idx = 0; idx < k; idx++) scanf("%lld", &arr[idx]); arr[k] = 0; for(idx = 0; idx < k; idx++) arr[k] += arr[idx]; for(idx = k + 1; idx < n; idx++) arr[idx] = (2 * arr[idx - 1] - arr[idx - k - 1] + divider) % divider; printf("%lld", arr[n - 1]); return 0; }
이 상태에서 long long으로 선언된 부분들을 int로 바꾸면 정상적으로 작동합니다만
지금 상태로도 딱히 메모리에 대하여 버그가 있어보이진 않다고 생각했습니다.
컴파일러에 따라 long long의 크기는 8바이트, long long*의 크기는 4바이트이기에 sizeof(long long*)에서 sizeof(long long)으로 바꾸어도 해결되질 않습니다.
막무가내로 sizeof(long long) * n * 2 라는 크기로 할당해주면 문제가 없어보이니 오버플로우인 것 같습니다.
for(idx = k + 1; idx < n; idx++) arr[idx] = (2 * arr[idx - 1] - arr[idx - k - 1] + divider) % divider;
라는 부분만 지우면 정상적으로 작동하니 이 부분이 문제인 것 같습니다.
정말로 문제가 일어날 이유가 없어보이는데,
Main: malloc.c:2394: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed.
라는 오류를 계속 뿜뿜하니 도무지 이유를 모르겠습니다.
참고로 이 코드가 다루는 문제는
https://codeup.kr/problem.php?id=2768
이고, 해당 코드가 내놓는 오류도 이 사이트에서 채점하는 결과로 나온 것입니다.
제 환경에서는 sizeof(long long*)을 sizeof(long long)으로 바꿔주기만해도 오류가 안 나긴합니다만...ㅠㅠ
...
무슨 값이 들어오는지는 모르지만, 중간에 arr[k]가 있으니 k는 n보다 반드시 작아야 하고 같거나 더 크면 안되겠군요.
...그 외에는 딱히 문제될 부분은 없는 것 같습니다.
댓글 달기