【问题标题】:Same program is giving me different outputs相同的程序给了我不同的输出
【发布时间】:2018-08-09 00:39:46
【问题描述】:

我正在尝试制作选择排序的递归版本。它还没有完成。我只设法找到最小元素的索引。当我运行我的程序时,有时它工作正常并输出正确的值,但有时它给我“1869833334”,然后由于某种原因出现分段错误,我不知道为什么。

#include <stdio.h>

int MaxInd(int arr[], int i, int len, int max, int index){
    if (arr[i]>max){
        max=arr[i];
        index=i;
    }

    if(i==len-1){
        return index;
    }

    index = MaxInd(arr,i+1,len,max,index);
    printf("%d\n", index);
    return index;
}

int SelectionSort(int arr[], int len){
int index,max,i;
int k = MaxInd(arr, i, len, max, index);
}

int main(void){
    int arr[6] = {1,4,5,0,9,2};
    int len=sizeof(arr)/sizeof(arr[0]);
    int var=SelectionSort(arr, len);
    printf("final index is: %d\n",var);
}

【问题讨论】:

  • iSelectionSort 中未初始化,当然你每次都会得到不同的结果,因为它是未定义的行为
  • 我把它改成了 int i=0;但它仍然给我同样的问题。
  • @Spectre maxindex 也没有设置。
  • 看我的回答

标签: c recursion segmentation-fault selection-sort


【解决方案1】:
int SelectionSort(int arr[], int len){
    int index,max,i;
    int k = MaxInd(arr, i, len, max, index);
}

indexmaxi 未初始化,您从中得到的结果是 每次都不一样,因为它是未定义的行为。

还有

int MaxInd(int arr[], int i, int len, int max, int index){
    if (arr[i]>max){
        max=arr[i];
        index=i;
    }
    ...

您应该在尝试访问arr[i] 之前检查i &lt; len,否则 您可以访问超出arr 的限制。你应该把支票放在前面 访问值:

int MaxInd(int arr[], int i, int len, int max, int index){
    if(i==len-1){
        return index;
    }

    if (arr[i]>max){
        max=arr[i];
        index=i;
    }

    ...

【讨论】:

  • 谢谢,这很有帮助。
猜你喜欢
  • 2017-03-15
  • 2017-09-25
  • 2020-08-17
  • 2014-01-03
  • 1970-01-01
  • 2019-04-23
  • 2021-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多