c - 输入数组后程序挂起

标签 c pointers alloc

#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 函数时。

最佳答案

在第一个for循环中输入数组的所有元素后挂起。

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

int *x;

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

x[i]=a[j];

将您的代码更改为:

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

它应该停止崩溃/挂起任何东西。

仅供引用,无论何时您 malloc() 您都应该 free() 现在您有内存泄漏。

关于c - 输入数组后程序挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14731667/

相关文章:

将整数值转换为位并将其存储到字符数组中?

c - 开始学习c但不知道为什么要用Return 0

c - 安全地直接写入内存地址

c++ - 无效使用不完整类型 'class...'

ios - 为什么 [[NSError alloc] init];在 Xcode 中抛出错误?

objective-c - 在启用 ARC 的项目中使用 alloc、init

c - 文件 I/O 的故障修复策略

c++ - 使用指向结构 C++ 的指针创建动态分配的数组

c++ - 同一个变量引用的参数指向不同的位置

c# - 如何在非托管内存中分配 IntPtr [] 数组?