質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

712閲覧

c言語 マージ関数の作成について

mizusato

総合スコア5

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/06/10 12:41

大学の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 文を一つコメント文にしたらエラーが表示されなくなったので問題のある場所はコメント文の場所だと思います
ですがどのように対処していいかわからないのでよろしくお願いします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

コンパイル中に以下のエラーメッセージが発生しました。

とありますが、その後の記述から、実行時エラーではありませんか?

[sd18254@eiw03 ~]$ ./a.out

は、作成したプログラムの実行です。
で、

while 文を一つコメント文

は、

/*while(p != Q+1)

の事でしょうか? ここ、 p が Q+1 以外の時、ループします。従って、実行時エラーとしては、p==Q+1 にならない限り、ループし、多分、配列T[]が範囲外となってエラー終了すると思われます。詳細は確認していませんが、その辺の確認を。

あと、ソースコードをアップする時は、コード部分をコードしてして指定しないと見ずらいです。

[追記]
p, q, r の値を確認していないので、違っていたら、申し訳ないですが、

  • p が最初から、 Q+1 より、大きい、
  • i の値が、r-p+1 の値を越えた、

あたりでしょうか。
while (p != Q+1) ですが、while (p < Q+1) と書いた方が安全と思います。
(とりあえず、動く。 本来は、どちらでも動くのが正しいのですが、、)

投稿2018/06/10 12:59

編集2018/06/10 13:10
pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mizusato

2018/06/10 13:03

回答ありがとうございます! ごめんなさい、コンパイルと実行を勘違いしてました、実行時のエラーです。 while 文の中身にp=p+1としてpがQ+1になるまで操作を続けたかったのですがおかしいでしょうか 指摘もありがとうございます!
y_waiwai

2018/06/10 13:09 編集

そのwhileに入るとき、pはどういう数値なんでしょうか また、Qは?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問