【问题标题】:program hangs after inputting array输入数组后程序挂起
【发布时间】:2013-02-06 14:39:40
【问题描述】:
#include<stdio.h>
#include<conio.h>
//#include<alloc.h>

int* mergeSort(int*,int);
int* merge(int*,int*,int);

void main()
{
  int n;int i=0;
  int *a,*b;

  scanf("%d",&n);
  a=(int)malloc(n*sizeof(int));
  for(;i<n;i++)
     scanf("%d",&a[i]);

  b=mergeSort(a,n);
  for(i=0;i<n;i++)
     printf("%d ",b[i]);

}

int* mergeSort(int *b,int n)
{
  int temp,*s;

  if(n>2)
  {
     mergeSort(b,n/2);
     mergeSort(b+n/2,n-n/2);
     s=merge(b,b+n/2,n);

     return s;
  }
  else if(n==2)
  {
     if(b[0]>b[1])
     {
         temp=b[0];
         b[0]=b[1];
         b[1]=temp; 
     }
     return;
  }
}

int* merge(int* a,int* c,int n)
{
  int i=0,j=0,k=0,
  int* x;

  while( (j ! =n/2) && (k != (n-n/2)) && (i < n))
  {
       if(a[j]<c[k])
       {
             x[i]=a[j];
             j++; 
             i++;
       }
       else
       {
             x[i]=c[k];
             k++;
             i++;
       }
   }
   for( ; j<n/2; j++,i++)
      x[i]=a[j];

   for( ; k < (n-n/2); k++,i++)
      x[i]=c[k];

   return x;
}

当我运行此代码时,它在第一个 for 循环中输入数组的所有元素后挂起。请帮助我,我该如何纠正它以使其成功运行?它挂起从 main() 函数调用 mergeSort 函数。

【问题讨论】:

  • @Shark 过时的 DOS 标头。
  • 这是相当可怕的代码。作为旁注,请don't cast the return value of malloc() in C
  • 调试调试调试调试!
  • conio.h => 控制台输入/输出
  • 1) mergeSort() 函数具有不返回值的代码路径。 2) merge() 函数使用未初始化的指针 (int *x)。可能还有其他问题,但我不再查找了。

标签: c pointers alloc


【解决方案1】:

it hangs after inputting all the elements of the array in first for loop.

挂起?你确定......考虑到你的合并代码声明了一个指向 int 的指针,这很好:

int *x;

并且从不初始化它,然后尝试跳转到过去的偏移量 (i):

x[i]=a[j];

将您的代码更改为:

int *x = malloc(n * sizeof(int));

它应该停止崩溃/挂起。

仅供参考,无论您何时malloc(),您现在都应该free() 出现内存泄漏。

【讨论】:

  • 非常感谢...现在它在按照您的建议初始化 int *x 后工作正常,谢谢@blastfurnace
  • @mike....你能帮我用递归做这个合并排序吗...这段代码没有给出正确的答案...请帮助我!
  • @yodh - 是的,我也注意到了,它很接近,但不太正确。你有没有调试过它?你有什么想法为什么它不起作用?
  • 是的,我已经调试过了……它运行良好,但问题是它仍然没有给出正确的答案。
  • @yodh - C 程序自己进行内存管理。您使用的操作系统可能会为您执行此操作,但这并不能保证...如果您曾经从事嵌入式项目或没有 MMU(内存管理单元)的计算机,几乎可以保证他们不会为您清理。因此,当你完成它们时释放你的记忆并关闭它们是一个好习惯和好风格。
【解决方案2】:

有些地方出了问题,不仅是基本的东西,比如void main 而不是int main,还有例如mergeSort() 中的return; 应该返回int* 和未初始化的x。关于算法还有一件重要的事情:您似乎假设 n 是 2 的幂:您递归地除以 2 并假设它始终是未截断的整数。

【讨论】:

  • main 返回 void 可能没问题,read this。虽然很可能,这种情况是一个托管程序,然后您对 main 的评论是正确的。
  • 但是我已经第二次使用 (n-n/2) 了...所以即使它被截断,我也会第二次获得其余的元素...不会吗?
  • 对。我忽略了这一点。但请考虑我写的其他观点。
【解决方案3】:

对于初学者,代码不能在 C++ 编译器中编译(我知道它是 C 代码,但仍然...),

有几个问题:

第 11 行:

a=(int)malloc(n*sizeof(int));

你为什么要转换一个指向 int 的指针? a 是一个整数 *

第 38 行:

return;

你从没有返回值的mergeSort返回......这不好

我建议您修复所有编译器错误和警告,然后重试

【讨论】:

  • 实际上我没有收到任何编译时错误,而是运行时错误……是的,在删除 int 强制转换并初始化 *x 之后,我的代码工作正常,但没有给出正确的结果。
猜你喜欢
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-17
  • 1970-01-01
相关资源
最近更新 更多