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)으로 바꿔주기만해도 오류가 안 나긴합니다만...ㅠㅠ

jick의 이미지

무슨 값이 들어오는지는 모르지만, 중간에 arr[k]가 있으니 k는 n보다 반드시 작아야 하고 같거나 더 크면 안되겠군요.

...그 외에는 딱히 문제될 부분은 없는 것 같습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.