Как исправить «стек вокруг переменной был поврежден».Переменные не изменяются на присвоенное значение после инициализации - PullRequest
0 голосов
/ 23 сентября 2019

Итак, мой код сортировки слиянием сработал, а затем я начал получать ошибки, когда пытался определить время выполнения.Теперь я получаю 'массив был поврежден', и я думаю, что это потому, что после инициализации 'left_bound' и 'right_bound' значения не изменятся, даже если я почти уверен, что назначаю их правильно.Таким образом, они представляют собой какое-то огромное отрицательное число, выходящее за пределы массива, что приводит к его повреждению (я думаю).

Я пытался назначить и инициализировать всеми возможными способами, которые я могу найти в Google.

    void merge(int arr[], int low_idx, int partition, int high_idx) {
    int i, j, k, right_bound;
    int left_bound (partition - low_idx + 1); 
    right_bound = (high_idx - partition);
    //temporary arrays
    int* left_of_partition = NULL;
    int* right_of_partition = NULL;
    left_of_partition = new int[left_bound];
    right_of_partition = new int[right_bound];

    for (i = 0; i < left_bound; i++) {
        left_of_partition[i] = arr[i + low_idx];
    }
    for (j = 0; j < right_bound; j++) {
        right_of_partition[j] = arr[partition + 1 + j];
    }

    i = 0;
    j = 0;
    k = 1;
    while (i < left_bound && j < right_bound) {
        if (left_of_partition[i] < right_of_partition[j]) {
            arr[k] = left_of_partition[i];
            i++;
        }
        else {
            arr[k] = right_of_partition[j];
            j++;
        }
        k++;
    }
    while (i < left_bound) {
        arr[k] = left_of_partition[i];
        i++;
        k++;
    }
    while (j < right_bound) {
        arr[k] = right_of_partition[j];
        j++;
        k++;
    }
    delete[] left_of_partition;
    delete[] right_of_partition;
    left_of_partition = NULL;
    right_of_partition = NULL;

}

void mergesort(int arr[], int low_idx, int high_idx)
{
    if (high_idx > low_idx) {
        int partition = (low_idx + high_idx) / 2;
        mergesort(arr, low_idx, partition);
        mergesort(arr, partition + 1, high_idx);
        merge(arr, low_idx, partition, high_idx);
    }

}
int main()
{
    int v2[] = { 9,8,7,6,5,4,3,2,1,0 };
    int max_idx = sizeof(v2) - 1;
    mergesort(v2, 0, max_idx);
}

1 Ответ

1 голос
/ 23 сентября 2019

sizeof(v2) возвращает объем памяти всего массива (= 10 * 4 = 40).Вы должны использовать sizeof(array) / sizeof(element), чтобы получить правильный номер.При размере = 40 ваш код записывается в память за этим локальным (массивом стека) из 10 элементов, который разрушает стек:

int main()
{
  int v2[] = { 9,8,7,6,5,4,3,2,1,0 };
  int max_idx = sizeof(v2) / sizeof(int) - 1; // divide by sizeof(int)
  mergesort(v2, 0, max_idx);
  return 0;
}
...