为什么在这个简单的 C++ 程序中会出现分段错误?

Why segmentation fault in this simple C ++ program?

我正在尝试合并两个已排序的子数组。我花了数小时的时间来消除 vs 代码中的 segmentation fault 错误,但没有成功。

#include<iostream>
#include<math.h>
using namespace std;

void merge(int start1,int end1,int start2,int end2,int arr[],int temp_arr[]){
    int i = start1;
    int j = start2;
    while (i <= end1 && j <= end2)
    {
        if(arr[i] < arr[j]){
            //using start1 as index on purpose
            temp_arr[start1++] = arr[i];
            i++; 
        }else{
            temp_arr[start1++] = arr[j];
            j++;
        }
    }

    //if first array elements are left
    while(i <= end1 ){
        temp_arr[start1++] = arr[i];
    }

    //if second array elements are left
    while(j <= end2){
        temp_arr[start1++] = arr[j];
    }
    
}

int main(){
    int arr[] = {5,6,7,1,2,3};
    int n = sizeof(arr)/sizeof(int);
    int temp[n];//temporary array
    int a;
    //to find where the next sorted subarray begins
    for(int i = 0;i <n-1;i++){
        if(arr[i] > arr[i+1]){
            a= i;
            break;
        }
    }
    
    merge(0,a,a+1,n-1,arr,temp);

    for(int i = 0;i < n;i++){
        cout << temp[i] << " ";
    }




}

这是一个无限循环:

while(i <= end1 ){
    temp_arr[start1++] = arr[i];
}

这个也是。

while(j <= end2){
    temp_arr[start1++] = arr[j];
}

在这两种情况下,由于 ijend1end2 都不会在这些循环中发生变化,因此 start1 将继续增加越过数组边界,在进行赋值的每次迭代中引入更多未定义的行为。

这可能不是您唯一的错误。