free関数で動作が止まる
freeしようとすると止まってしまいます。(1)
q4614822の質問では用意するサイズが間違っていると起こるらしいのですが、出力に問題はないようです。スタックトレースというものをやってみたいのですが、C言語でも出来ますか?
もう1つ質問ですがmerge_sortをmerge-sortで宣言するとコンパイルが通らない理由をお教え下さい。(2)
出力結果(1)
42 33 78 19 46 63 25 11 54 17
11 17 19 25 33 42 46 54 63 78
^C←ここで止まります。
出力結果(2)
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
main.c:
エラー E2449 main.c 5: 'merge' のサイズが不明、あるいはゼロ
エラー E2141 main.c 5: 宣言の構文エラー
エラー E2356 main.c 6: 'merge' の再宣言で型が一致していない
エラー E2344 main.c 5: 一つ前の 'merge' の定義位置
警告 W8065 main.c 15: プロトタイプ宣言のない関数 'sort' の呼び出し(関数 main )
警告 W8019 main.c 15: コードは効果を持たない(関数 main )
エラー E2356 main.c 23: 'merge' の再宣言で型が一致していない
エラー E2344 main.c 6: 一つ前の 'merge' の定義位置
エラー E2449 main.c 30: 'merge' のサイズが不明、あるいはゼロ
エラー E2356 main.c 30: 'merge' の再宣言で型が一致していない
エラー E2344 main.c 23: 一つ前の 'merge' の定義位置
エラー E2141 main.c 30: 宣言の構文エラー
*** 10 errors in Compile ***
#include<stdio.h>
#include<stdlib.h>
#define N 10
void merge_sort(int,int);
void merge(int,int);
int a[N]={42,33,78,19,46,63,25,11,54,17};
int *b;
int main(){
int i=0;
b=(int*)malloc(sizeof(int)*N);
while(i<N)printf("%3d",a[i++]);
printf("\n");
merge_sort(0,N-1);
free(b);
i=0;
while(i<N)printf("%3d",a[i++]);
printf("\n");
return 0;
}
void merge(int left,int right){
int half=(right+left-1)/2,i=left,j=half+1,k;
for(k=0;k<left+right+1;k++){
if((i<=half)&&(a[i]<a[j]||j==right+1))b[left+k]=a[i++];
else b[left+k]=a[j++];
}
}
void merge_sort(int left,int right){
if(left<right){
int half,k;
half=(right+left-1)/2;
merge_sort(left,half);
merge_sort(half+1,right);
merge(left,right);
for(k=left;k<=right;k++)a[k]=b[k];
}
}
お礼
ご回答ありがとうございました。 ご提示の方法も試してみたいと思います。