关于归并排序中内存释放的问题

你还真行2012 2016-04-18 09:19:47
尝试了一个归并排序的例子,代码如下
#include <stdio.h>
#include <stdlib.h>

void Merge(int a[], int p, int q, int r)
{
int lenl = q - p+1;
int lenr = r - q;

int i, j,k;
int *L = (int*)malloc(sizeof(lenl));
int *R = (int*)malloc(sizeof(lenr));

for (i = 0; i < lenl; i++) {
L[i] = a[p + i];
}

for (j = 0; j < lenr; j++) {
R[j] = a[q + 1 + j];
}

i = j = k = 0;
while (i < lenl && j < lenr) {
if (L[i]<R[j]) {
a[p + k++] = L[i++];
}
else {
a[p + k++] = R[j++];
}
}
while (i < lenl) {
a[p + k++] = L[i++];
}
while (j < lenr) {
a[p + k++] = R[j++];
}

free(L);
free(R);
}

void MergeSort(int a[], int p, int r)
{
if (p == r) {
return;
}
int mid = (p + r) / 2;
MergeSort(a, p, mid);
MergeSort(a, mid + 1, r);
Merge(a, p, mid, r);
}

int main(void)
{
int i;
int a[] = { 76,5,34,3,13,4,6,75 };
int last_index = sizeof(a) / sizeof(int) - 1;
MergeSort(a, 0, last_index);
for (i = 0; i <= last_index;i++) {
printf("%d\n", a[i]);
}
return 0;
}


问题是在方法Merge中的最后两行代码free(L)和free(R),加上这两句会运行错误,删掉会正常运行
...全文
115 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 2016-04-18
  • 打赏
  • 举报
回复
通常是你访问申请到的内存越界了而导致堆破坏,在释放时就会出错
小灸舞 版主 2016-04-18
  • 打赏
  • 举报
回复
是你malloc的地方有问题,应该是:
int *L = (int*)malloc(sizeof(int)*lenl);
int *R = (int*)malloc(sizeof(int)*lenr);

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

void Merge(int a[], int p, int q, int r)
{
int lenl = q - p+1;
int lenr = r - q;

int i, j,k;
int *L = (int*)malloc(sizeof(int)*lenl);
int *R = (int*)malloc(sizeof(int)*lenr);

for (i = 0; i < lenl; i++) {
L[i] = a[p + i];
}

for (j = 0; j < lenr; j++) {
R[j] = a[q + 1 + j];
}

i = j = k = 0;
while (i < lenl && j < lenr) {
if (L[i]<R[j]) {
a[p + k++] = L[i++];
}
else {
a[p + k++] = R[j++];
}
}
while (i < lenl) {
a[p + k++] = L[i++];
}
while (j < lenr) {
a[p + k++] = R[j++];
}

free(L);
free(R);
}

void MergeSort(int a[], int p, int r)
{
if (p == r) {
return;
}
int mid = (p + r) / 2;
MergeSort(a, p, mid);
MergeSort(a, mid + 1, r);
Merge(a, p, mid, r);
}

int main(void)
{
int i;
int a[] = { 76,5,34,3,13,4,6,75 };
int last_index = sizeof(a) / sizeof(int) - 1;
MergeSort(a, 0, last_index);
for (i = 0; i <= last_index;i++) {
printf("%d\n", a[i]);
}
return 0;
}

69,371

社区成员

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

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