我在C中为Merge Sort编写了一个程序,但是我遇到了Segmentation Fault,我不知道为什么?你能给我一个暗示可能出错的东西吗?
代码:
#include <stdio.h>
#include <math.h>
void Merge(int A[],int p,int q,int r){
int n1,n2,i,j,k;
n1=q-p+1;
n2=r-q;
int L[n1],R[n2];
for (i=0; i<n1; i++) L[i]=A[p+i-1];
for (j=0; j<n2; j++) R[j]=A[q+j];
i=0;
j=0;
for (k=p; k<r; k++){
if (L[i]<=R[j]){
A[k]=L[i];
i=i+1;
}
else{
A[k]=R[j];
j=j+1;
}
}
}
void Sort(int A[],int p,int r){
int q;
if (p<r){
q=floor((p+r)/2);
Sort(A,p,q);
Sort(A,q+1,r);
Merge(A,p,q,r);
}
}
int main()
{
int n,i,p,r;
printf("Give a value for n: \n");
scanf("%d",&n);
int A[n];
for (i=0; i<n; i++){
printf ("Give %d th value of the array: \n",i+1 );
scanf("%d",&A[i]);
}
printf("Give me a value for p:\n");
scanf("%d",&p);
printf("Give me a value for r:\n");
scanf("%d",&r);
Sort(A,p,r);
printf("p=%d, r=%d \n \n", p,r);
for (i=0; i<n; i++) printf("%d", A[i]);
return 0;
}
这就是我得到的,在终端提供输入:
Give a value for n: 8 Give 1 th value of the array: 1 Give 2 th value of the array: 6 Give 3 th value of the array: 5 Give 4 th value of the array: 3 Give 5 th value of the array: 5 Give 6 th value of the array: 4 Give 7 th value of the array: 2 Give 8 th value of the array: 7 Give me a value for p: 2 Give me a value for r: 6 Segmentation fault (core dumped)
在Sort函数中我做错了吗?
答案 0 :(得分:3)
可能的罪魁祸首是这两行:
int n1,n2,i,j,k;
int L[n1],R[n2];
首先,您声明n1
和n2
,但不要初始化它们。这意味着它们的值是 indeterminate ,并且在初始化它们之前不应该使用这些变量。
但是,在下一行中你仍然使用它们,这会导致undefined behavior,这意味着你的整个程序都是格式错误的,不能依赖它来正常工作。
答案 1 :(得分:2)
在您实例化变量n1
和n2
之前,函数Merge
中的L[]
和R[]
变量未定义。
试试这个:
int n1, n2, i, j, k;
n1 = q - p + 1;
n2 = r - q;
// Now you can instantiate your arrays
int L[n1], R[n2];
答案 2 :(得分:0)
#include<stdio.h>
void mergesort(int a[],int beg,int end)
{
int mid;
if(beg<end)
mid = (beg+end)/2;
mergesort(a,beg,mid);
mergesort(a,mid+1,end);
merge(a,beg,mid,end);
}
void merge(int a[],int beg,int mid,int end)
{
int i=beg,j=mid+1,index=beg,temp[100],k;
while((i<=mid) && (j<=end))
{
if(a[i]<a[j])
{
temp[index]=a[i];
i=i+1;
}
else
{
temp[index]=a[j];
j++;
}
index++;
}
if(i>mid)
{
while(j<=end)
{
temp[index]=a[j];
j++;
index++;
}
}
else
{
while(i<=mid)
{
temp[index]=a[i];
i++;
index++;
}
}
for(k=beg;k<index;k++)
{
a[k]=temp[k];
}
}
int main()
{
int a[100],n,i,j;
printf("enter size of array");
scanf("%d",&n);
printf("enter elements");
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
mergesort(a,0,n-1);
for(i=0;i<n;i++)
{
printf("5d",a[i]);
}
return 0;
}