c语言中数组作为参数传递时的分段错误

c语言中数组作为参数传递时的分段错误,c,segmentation-fault,C,Segmentation Fault,作为一项任务,我必须实现mergesort。当我将数组作为参数传递时,我得到了分段错误。一切似乎都是正确的。我正在附上代码。 arr是int-arr[1000],我将它作为传递给mergesort mergesort(arr,0,n) 剩下的代码如下 void merge(int a[], int l, int m, int r) { int temp[r -l]; int templ = l; int tempm = m; register int k;

作为一项任务,我必须实现mergesort。当我将数组作为参数传递时,我得到了分段错误。一切似乎都是正确的。我正在附上代码。
arr
int-arr[1000]
,我将它作为
传递给
mergesort
mergesort(arr,0,n)

剩下的代码如下

void merge(int a[], int l, int m, int r)
{
    int temp[r -l];
    int templ = l;
    int tempm = m;
    register int k; 
    for(k=0; k<(r-l); k++)
    {
    if((tempm >= r)||(templ < m)&&(a[templ] <= a[tempm]))
    {   /*if number from left subarray is smaller*/
    temp[k] = a[templ];
    templ++;
    }
    else
    {   /*number from right subarray is smaller*/
    temp[k] = a[tempm];
    tempm++;
    }
    }
    for(k= l; k< r; k++)
    {   /*copy results back to the array to be returned*/
    a[k] = temp[k - l];
    }
}

void mergesort(int ar[], int left, int right)
{
    int mid;    
    if(left < right)
    {
    mid= (left + right)/2;
    mergesort(&ar[0], left, mid - 1);
    mergesort(&ar[0], mid, right);
    merge(&ar[0], left, mid, right);
    }
}
void合并(int a[],int l,int m,int r)
{
内部温度[r-l];
int-temp=l;
int tempm=m;
寄存器int k;

对于(k=0;k=r)| |(tempmergesort
中有
left==0
right==1
,就会有一个无限递归:

void mergesort(int ar[], int left, int right) // IF LEFT IS 0 AND RIGHT IS 1 HERE...
{
    int mid;    
    if(left < right) // ...THEN LEFT IS LESS THAN RIGHT AND...
    {
    mid= (left + right)/2;
    mergesort(&ar[0], left, mid - 1);
    mergesort(&ar[0], mid, right); // ...HERE WE HAVE A CALL THAT IS
    // IDENTICAL TO THE ONE THAT GOT US HERE, INFINITE RECURSION
void mergesort(int-ar[],int-left,int-right)//如果这里left是0,right是1。。。
{
int mid;
如果(左<右)/…则左小于右,并且。。。
{
中间=(左+右)/2;
合并排序(&ar[0],左,中-1);
mergesort(&ar[0],中,右);/…这里我们有一个调用
//和我们在这里看到的一样,无限递归

@wilsonmichaelpatrik:但在每次调用中计算mid时,我们都在减少右边的值,增加左边的值。因此,在某一点上,左边的值可能会大于右边的值。因此它将停止递归。您能简单地告诉我您是如何看待它的吗?当您调用mergesort(&ar[0],0,1)时会发生什么情况;假设我们在mergesort中,left为0,right为1,那么left&ar[0]
您可以使用等效且更简单的
ar
。在这种情况下,使用数组名称与传递元素
0
的地址相同。