归并排序C语言实现,跟严蔚敏数据结构书上的代码差不多,报错 40
#include<stdio.h>#include<stdlib.h>#include<memory.h>voidmerge(ints[],intT[],inti,int...
#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
void merge(int s[], int T[], int i, int m, int n);
void MSort(int SR[], int T1[], int s, int t);
int main()
{
int a[4] = { 5, 3,4,1};
int T[4];
MSort(a, T, 0, 3);
int i;
for (i = 0; i <4; i++)
printf("%d ", T[i]);
return 0;
}
void merge(int s[],int T[], int i, int m, int n)
{
int j, k;
for (j = m + 1, k = i; i <= m&&j <= n; k++)
{
if (s[i] < s[j])
T[k] = s[i++];
else
T[k] = s[j++];
}
if (i <= m)
memcpy(&T[k], &s[i], (m - i + 1)*sizeof(int));
if (j<=n)
memcpy(&T[k], &s[j], (n-j + 1)*sizeof(int ));
}
void MSort(int SR[], int T1[], int s, int t)
{
if (s == t)
T1[s] = SR[s];
else
{
int* T2 = (int *)malloc((t - s + 1)*sizeof(int));
int m = (s + t) / 2;
MSort(SR,T2,s,m);
MSort(SR, T2, m+1, t);
merge(T2, T1, s, m, t);
free(T2);
}
}
报错,wrote to memory after end of heap buffer 展开
#include<stdlib.h>
#include<memory.h>
void merge(int s[], int T[], int i, int m, int n);
void MSort(int SR[], int T1[], int s, int t);
int main()
{
int a[4] = { 5, 3,4,1};
int T[4];
MSort(a, T, 0, 3);
int i;
for (i = 0; i <4; i++)
printf("%d ", T[i]);
return 0;
}
void merge(int s[],int T[], int i, int m, int n)
{
int j, k;
for (j = m + 1, k = i; i <= m&&j <= n; k++)
{
if (s[i] < s[j])
T[k] = s[i++];
else
T[k] = s[j++];
}
if (i <= m)
memcpy(&T[k], &s[i], (m - i + 1)*sizeof(int));
if (j<=n)
memcpy(&T[k], &s[j], (n-j + 1)*sizeof(int ));
}
void MSort(int SR[], int T1[], int s, int t)
{
if (s == t)
T1[s] = SR[s];
else
{
int* T2 = (int *)malloc((t - s + 1)*sizeof(int));
int m = (s + t) / 2;
MSort(SR,T2,s,m);
MSort(SR, T2, m+1, t);
merge(T2, T1, s, m, t);
free(T2);
}
}
报错,wrote to memory after end of heap buffer 展开
展开全部
你的变量定义和使用不符合C语言规范:所有变量必须先定义后使用。
更改代码如下(只需要修改一下顺序就好):
int T[4];
int i;
MSort(a, T, 0, 3);
亲测编译通过,望采纳!
更改代码如下(只需要修改一下顺序就好):
int T[4];
int i;
MSort(a, T, 0, 3);
亲测编译通过,望采纳!
追问
本来编译就没错·······运行时出错,应是内存泄露
追答
好的,已经找到问题了。是free(T2)出问题了,去掉这一句就可以了。解释如下:
由于你在归并排序中使用了递归的方法,递归函数自我调用,完成后返回调用点,你每次调用后就释放形参指针,导致递归返回无法找到调用点,所以出错了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询