释放内存出错,不知为何?

WuYL7812 2004-08-31 09:32:28
/*
在mergeSort里申请了临时空间,完后释放出错,不知为何
完整代码如下:请大家对代码规范问题也提出意见,谢谢
*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

/*把value[low-mid]和value[(mid+1)-high]归并排序,结果放在dest里*/
void merge(int dest[], int value[], int low, int mid, int high)
{
int i = mid + 1;
int j = low;
int k = low;

while (i <= high && j <= mid)
{
if (value[i] < value[j])
{
dest[k++] = value[i++];
}
else
{
dest[k++] = value[j++];
}
}
while (i <= high)
{
dest[k++] = value[i++];
}
while (j <= mid)
{
dest[k++] = value[j++];
}
}

/*归并排序函数,temp是排序要用到的临时空间,把values[low-high]之间的数据排序*/
void mergeSortTemp(int values[], int low, int high, int temp[])
{
if (high > low)
{
int mid = (low + high) / 2;
mergeSortTemp(values, low, mid, temp);
mergeSortTemp(values, mid + 1, high, temp);
merge(temp, values, low, mid, high);
memcpy(values + low, temp + low, (high - low) * sizeof(int));
}

}

/*归并排序函数*/
void mergeSort(int values[], int number)
{
int *temp = (int*)malloc(sizeof(int) * number);
mergeSortTemp(values, 1, number, temp);
/*free(temp); */ /*运行到此行时出错,不知道为什么*/
}

int main()
{
int values[] = {0, 1, 3, 5, 2, 4, 6};
int i = 0;

mergeSort(values, 6);
for (i = 1; i <= 6; i++)
{
printf("%d ", values[i]);
}
printf("\n");
return 0;
}
...全文
170 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
pukkah 2004-09-01
  • 打赏
  • 举报
回复
有效下标为(n-1),上面写错了
WuYL7812 2004-09-01
  • 打赏
  • 举报
回复
/*
问题解决了,原来算法有差1错误
谢谢各位,回去给分
正确代码如下:
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

/*把value[low-mid]和value[(mid+1)-high]归并排序,结果放在dest里*/
void merge(int dest[], int value[], int low, int mid, int high)
{
int i = mid + 1;
int j = low;
int k = low;

while (i <= high && j <= mid)
{
if (value[i] < value[j])
{
dest[k++] = value[i++];
}
else
{
dest[k++] = value[j++];
}
}
while (i <= high)
{
dest[k++] = value[i++];
}
while (j <= mid)
{
dest[k++] = value[j++];
}
}

/*归并排序函数,temp是排序要用到的临时空间,把values[low-high]之间的数据排序*/
void mergeSortTemp(int values[], int low, int high, int temp[])
{
if (high > low)
{
int mid = (low + high) / 2;
mergeSortTemp(values, low, mid, temp);
mergeSortTemp(values, mid + 1, high, temp);
merge(temp, values, low, mid, high);
memcpy(values + low, temp + low, (high - low + 1) * sizeof(int));
}
}

/*归并排序函数*/
void mergeSort(int values[], int number)
{
int *temp = (int*)malloc(sizeof(int) * number);
mergeSortTemp(values, 0, number - 1, temp);
free(temp);
}

int main()
{
int const MAX_NUMBER = 20;
int table[MAX_NUMBER];
int i = 0;

srand(time(0));
for (i = 0; i < MAX_NUMBER; i++)
{
table[i] = rand();
}
mergeSort(table, MAX_NUMBER);
for (i = 0; i < MAX_NUMBER; i++)
{
printf("%d ", table[i]);
}
printf("\n");
return 0;
}

azs 2004-09-01
  • 打赏
  • 举报
回复
我是从1开始的,0单元浪费了,这样比较容易实现。
即使错了释放内存时也不会出错。我用vc6.0,dev c++4.96运行都有问题,用turbo c2.0没有问题,不知道为什么?
//////////////////////////////
应该是释放内存之前出的错,只是你的断点设置问题
有些情况可以运行通过,是因为你用了debug模式编译的吧,有些环境会在debug模式下为你多分配几个字节内存

前面的说得没错,问题就出在你的数组大小上
pukkah 2004-08-31
  • 打赏
  • 举报
回复
你的算法中的数组用得都是1-n,你申请的内存也是使用的是1-n,temp大小为n单元,有效下标为n,所以在释放时出错。把申请的内存改为n+1就可以了
int *temp = (int*)malloc(sizeof(int) * (number+1));
WuYL7812 2004-08-31
  • 打赏
  • 举报
回复
我是从1开始的,0单元浪费了,这样比较容易实现。
即使错了释放内存时也不会出错。我用vc6.0,dev c++4.96运行都有问题,用turbo c2.0没有问题,不知道为什么?
applealin 2004-08-31
  • 打赏
  • 举报
回复
同意楼上的
sandrowjw 2004-08-31
  • 打赏
  • 举报
回复
mergeSortTemp(values, 0, number - 1, temp);
sandrowjw 2004-08-31
  • 打赏
  • 举报
回复
是number - 1吧

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧