C++ -为什么这会返回一个分段错误(核心转储)?[关闭]

kcugc4gi  于 2023-06-07  发布在  其他
关注(0)|答案(2)|浏览(157)

**关闭。**此题需要debugging details。目前不接受答复。

编辑问题以包括desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将帮助其他人回答这个问题。
13小时前关闭
Improve this question
我试着测试和计算合并和插入排序对数组进行排序所需的时间。
正如你所看到的,我使用兰德()来生成随机整数,无论出于什么原因,如果我使用int asize = rand()% 100(或任何小数字),它都可以工作,但我需要更大的数字来测试这两个算法。

#include <bits/stdc++.h>
using namespace std;
using namespace std::chrono;

void generateArray(int arr[], int asize)
{
    for(int i = 0; i < asize; i++)
    {
        arr[i] = rand();
    }
}

void insertionSort(int arr[], int size)
{
    for (int i = 1; i < size; ++i) {
        int key = arr[i];
        int j = i - 1;

        while (j >= 0 && arr[j] > key) {
            arr[j + 1] = arr[j];
            j--;
        }
        arr[j + 1] = key;
    }
}

void merger(int arr[], int left, int mid, int right)
{
    int n1 = mid - left + 1;
    int n2 = right - mid;
    int leftArr[n1];
    int rightArr[n2];

    for (int i = 0; i < n1; ++i)
        leftArr[i] = arr[left + i];
    for (int j = 0; j < n2; ++j)
        rightArr[j] = arr[mid + 1 + j];

    int i = 0;
    int j = 0;
    int k = left;

    while (i < n1 && j < n2) {
        if (leftArr[i] <= rightArr[j]) {
            arr[k] = leftArr[i];
            i++;
        } else {
            arr[k] = rightArr[j];
            j++;
        }
        k++;
    }

    while (i < n1) {
        arr[k] = leftArr[i];
        i++;
        k++;
    }

    while (j < n2) {
        arr[k] = rightArr[j];
        j++;
        k++;
    }
}

void mergeSort(int arr[], int left, int right)
{
    if (left < right)
    {
        int mid = left + (right - left) / 2;

        mergeSort(arr, left, mid);
        mergeSort(arr, mid + 1, right);

        merger(arr, left, mid, right);
    }
}

void printArray(int arr[], int size)
{
    for (int i = 0; i < size; ++i)
    {
        cout << arr[i] << " ";
    }
    cout << endl;
}

int main()
{
    // % 1000 to generate a value between 0 and 999
    int asize = rand();
    int forMerge[asize];
    generateArray(forMerge, asize);
    auto forInsertion = forMerge;
    auto startMerge = high_resolution_clock::now();
    mergeSort(forMerge, 0, asize - 1);
    auto stopMerge = high_resolution_clock::now();
    auto durationMerge = duration_cast<nanoseconds>(stopMerge - startMerge);
    cout << "Time to finish merge sort: " << durationMerge.count() << endl;
    // printArray(forMerge, asize);
    auto startInsertion = high_resolution_clock::now();
    insertionSort(forInsertion, asize);
    auto stopInsertion = high_resolution_clock::now();
    auto durationInstertion = duration_cast<nanoseconds>(stopMerge - startMerge);
    cout <<"Time to finish instertion sort: " << durationInstertion.count() << endl;
    // printArray(forInsertion, asize);
}

我尝试了int asize =兰德()% 99;它是有效的,但我需要更大的数字,因为我想测试这些不同的算法。

e4yzc0pl

e4yzc0pl1#

数组forMerge正在堆栈上分配。堆栈大小不是无限的;通常只有几兆字节。大型数组应该在堆上分配。
如果你像这样重写它,你会发现它适用于任何大小:

int asize = rand() % 1000000;
int *forMerge = new int[asize];

或者更好:

int asize = rand() % 1000000;
std::vector<int> forMerge(asize);

顺便说一下,你不应该在可移植程序中使用rand()来生成大的数字,因为它生成的值在0和兰德_MAX之间,并且RAND_MAX不能保证大于32767。

wydwbb8l

wydwbb8l2#

在main的第二行创建asize变量之后,立即执行以下语句:“printf(“asize %d\n”);你会看到它有一个在10亿到20亿之间的随机数。下一条指令尝试打开一个具有此数据量的数组。这会导致分段故障(核心转储)。
尝试较小的数量:int maximum();
并分配内存:int * forMerge =(int*)malloc(sizeof(int)* asize);

相关问题