为什么/ printf调用会改变函数的结果?

问题描述 投票:0回答:1

首先,我刚开始使用C,所以也许我缺少真正愚蠢的东西。

但是我有以下问题:

我有函数,如果我有一个printf调用,那只会给我正确的解决方案。没有该调用会产生错误的结果。

我在代码中有一些检查错误,然后将其删除。所以我首先想到的是,我还删除了一些必要的代码,下一个是我在printf-calls中使用它们时更改了变量或其他内容。

但是情况并非如此,一个简单的“ printf(” test“);”足以使函数执行我想要的操作。很好,但是我当然想找出问题所在,尤其是下一次可能会起作用。

我想我的问题是,为什么printf-call对我的功能有这么大影响?是否有一般原因?

在我的代码下面:

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;
}
c sorting quicksort
1个回答
-1
投票

堆栈溢出。对printf的调用将非必需变量填充到堆栈中,因此覆盖不会中断它。尝试找到一个最小的可复制示例,或使用调试器隔离该错误。

编辑:我知道错误是array_right[i-len2] = array[i],询问者没有要求调试代码,但是printf如何影响结果。

© www.soinside.com 2019 - 2024. All rights reserved.