大学のc言語の授業でマージ関数のプログラムを作っています。
コード
#include <stdio.h>
#include <stdlib.h>
int merge(int *array, int p, int q, int r)
{
int j, P = p, Q = q;
static int i = 0, *T;
T = ( int * ) malloc ( r-p+1 * sizeof ( int ) );
if(!T)
{
printf("メモりが確保できませんでした。\n");
return 1;
}
if(array[q] <= array[r])
{
while(p != Q+1)
{
if(array[p] <= array[q+1])
{
T[i] = array[p];
i = i + 1;
p = p + 1;
}
else if(array[p] > array[q+1])
{
T[i] = array[q+1];
i = i + 1;
q = q + 1;
}
}
while(q != r) { T[i] = array[q+1]; i = i + 1; q = q + 1; } }
else if(array[q] > array[r])
{
while(q != r)
{
if(array[p] <= array[q+1])
{
T[i] = array[p];
i = i + 1;
p = p + 1;
}
else if(array[p] > array[q+1])
{
T[i] = array[q+1];
i = i + 1;
q = q + 1;
}
}
/*while(p != Q+1) { T[i] = array[p]; i = i + 1; p = p + 1; }*/ printf("%d %d\n", i, Q); }
for(j=0; j<=r-P; j++)
{
array[j+P] = T[j];
}
free(T);
return i;
}
int main()
{
int n, *array, p, q, r, i, a;
scanf("%d\n", &n); array = ( int * ) malloc ( n * sizeof ( int ) ); if(!array) { printf("メモりが確保できませんでした。\n"); return 1; } scanf("%d %d %d\n", &p, &q, &r); for(i=0; i<n; i++) { scanf("%d", &array[i]); } a = merge(array, p, q, r); for(i=0; i<n-1; i++) { printf("%d ", array[i]); } printf("%d\n", array[n-1]); printf("%d\n", a); free(array); return 0;
}
コンパイル中に以下のエラーメッセージが発生しました。
エラーメッセージ
[sd18254@eiw03 ~]$ emacs 20.c &
[1] 17781
[sd18254@eiw03 ~]$ gcc -Wall 20.c
[1]+ 終了 emacs 20.c
[sd18254@eiw03 ~]$ ./a.out
8
1 4 7
2 1 3 4 8 5 6 7
*** Error in `./a.out': free(): invalid next size (fast): 0x00000000021e1040 ***
======= Backtrace: =========
/lib64/libc.so.6(+0x7c619)[0x7f0f906a0619]
./a.out[0x4009fb]
./a.out[0x400abf]
/lib64/libc.so.6(__libc_start_main+0xf5)[0x7f0f90645c05]
./a.out[0x4005b9]
======= Memory map: ========
00400000-00401000 r-xp 00000000 00:28 1375096030 /home/usrs/sd18254/a.out
00600000-00601000 r--p 00000000 00:28 1375096030 /home/usrs/sd18254/a.out
00601000-00602000 rw-p 00001000 00:28 1375096030 /home/usrs/sd18254/a.out
021e1000-02202000 rw-p 00000000 00:00 0 [heap]
7f0f8c000000-7f0f8c021000 rw-p 00000000 00:00 0
7f0f8c021000-7f0f90000000 ---p 00000000 00:00 0
7f0f9040e000-7f0f90423000 r-xp 00000000 08:02 18769 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
7f0f90423000-7f0f90622000 ---p 00015000 08:02 18769 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
7f0f90622000-7f0f90623000 r--p 00014000 08:02 18769 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
7f0f90623000-7f0f90624000 rw-p 00015000 08:02 18769 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
7f0f90624000-7f0f907dc000 r-xp 00000000 08:02 5672 /usr/lib64/libc-2.17.so
7f0f907dc000-7f0f909dc000 ---p 001b8000 08:02 5672 /usr/lib64/libc-2.17.so
7f0f909dc000-7f0f909e0000 r--p 001b8000 08:02 5672 /usr/lib64/libc-2.17.so
7f0f909e0000-7f0f909e2000 rw-p 001bc000 08:02 5672 /usr/lib64/libc-2.17.so
7f0f909e2000-7f0f909e7000 rw-p 00000000 00:00 0
7f0f909e7000-7f0f90a08000 r-xp 00000000 08:02 2147824 /usr/lib64/ld-2.17.so
7f0f90bde000-7f0f90be1000 rw-p 00000000 00:00 0
7f0f90c05000-7f0f90c08000 rw-p 00000000 00:00 0
7f0f90c08000-7f0f90c09000 r--p 00021000 08:02 2147824 /usr/lib64/ld-2.17.so
7f0f90c09000-7f0f90c0a000 rw-p 00022000 08:02 2147824 /usr/lib64/ld-2.17.so
7f0f90c0a000-7f0f90c0b000 rw-p 00000000 00:00 0
7fffa2496000-7fffa24b7000 rw-p 00000000 00:00 0 [stack]
7fffa2548000-7fffa254a000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
中止 (コアダンプ)
試したこと
上のコード中にあるようにwhile 文を一つコメント文にしたらエラーが表示されなくなったので問題のある場所はコメント文の場所だと思います
ですがどのように対処していいかわからないのでよろしくお願いします
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/10 13:03
2018/06/10 13:09 編集