Почему / как вызов printf меняет результат моей функции? - PullRequest
1 голос
/ 21 апреля 2020

Сначала я только начал с C, так что, возможно, я упускаю что-то действительно глупое.

Но у меня есть следующая проблема:

У меня есть функция, которая только дает мне правильное решение, если у меня есть вызов printf. Без этого вызова он дает неправильный результат.

У меня было несколько в коде, чтобы проверить на наличие ошибок, а затем удалил их. Итак, моей первой мыслью было, что я также удалил какой-то важный код, а следующий - что я изменил переменную или что-то еще, когда использовал их в своих вызовах printf.

Но все это было не так, простой "printf (" тест ");" достаточно, чтобы заставить функцию делать то, что я хочу. Это хорошо, но, конечно, я хочу найти проблему, тем более, что в следующий раз она может сработать.

Наверное, мой вопрос: почему вызов printf так сильно влияет на мою функцию? Есть ли общая причина?

Ниже моего кода:

void mergesort(int* array, size_t len)
{
    if (len <= 1)
    {
        return;
    }

    printf("test");

    size_t len2 = len / 2;

    int array_left[len2];
    int array_right[len-len2];
    size_t len_left;

    for (len_left = 0; len_left < len2; len_left++)
    {
        array_left[len_left] = array[len_left];
    }

    for (size_t i = len2; i < len; i++)
    {
        array_right[i-len2] = array[i];
    }

    mergesort(array_left, len_left);
    mergesort(array_right, len - len_left);

    size_t counter_left = 0;
    size_t counter_right = 0;

    for (size_t i = 0; i < len; i++)
    {
        if (array_left[counter_left] <= array_right[counter_right])
        {
            array[i] = array_left[counter_left];
            counter_left++;            
        }
        else
        {
            array[i] = array_right[counter_right];
            counter_right++;
        }
    }

    return;
}

1 Ответ

0 голосов
/ 21 апреля 2020

Переполнение стека. Вызов printf дополняет ваш стек несущественными переменными, поэтому переопределение не прерывает его. Попробуйте найти минимальный воспроизводимый пример или используйте отладчик, чтобы изолировать ошибку.

Редактировать: я знаю, что ошибка array_right[i-len2] = array[i], спрашивающий не просил отладить код, но как может printf повлиять результат.

...