首页 > 解决方案 > 代码在达到交换功能后停止,如果我将其注释掉,它会完美运行

问题描述

代码在到达交换函数后中断并且不再运行,即使如果我将其注释掉它也可以工作,而且我看不出它为什么停止工作的问题。

#include <stdio.h>

#define size 10

void swap(int *max,int *minimum);//swaps maximum value location with minimum value location 

void max_min(int arr[],int *max,int *min,int *locmin,int *locmax);

int main()
{
    int grades[10]={40,52,77, 80, 85, 88, 90, 66,55,99};
    int max=0,min=0,locmax,locmin;
    max_min(grades,&max,&min,&locmin,&locmax);//Gets maximum-minimum values and their location
    printf("Largest grade %d\n smallest grade %d\n",max,min);
    swap(&grades[locmax],&grades[locmin]);// only swaps smallest-greatest value  
}      

void swap(int *max,int *minimum)
{
    int temp=*max;
    *max=*minimum;
    *minimum=temp;
}    

void max_min(int arr[],int *max,int *min,int *locmin,int *locmax)
{
    int maxx,minx;
    maxx=arr[0];
    minx=arr[0];
    for (int k = 0; k <size; k++)
    {
        
        for(int i=1; i<size; i++)
        {
            /* If current element is greater than max */
            if(arr[i] > maxx)
            {
                maxx= arr[i];
                *locmax=i;
            }
            
            /* If current element is smaller than min */
            if(arr[i] < minx)
            {
                minx= arr[i];
                *locmin=i;
            }
        }
    }
    *max=maxx;
    *min=minx;
}

标签: c

解决方案


locmin 和 locmax 永远不会被 main 或 max_min 初始化。结果是它们将包含当时内存中的任何垃圾。如果你很幸运,那将是 0,但它可能是任何东西。这可能导致 locmin 或 locmax 超出等级数组的范围。它们小于 0 或大于 9。因此grades[locmin]grades[locmax]尝试访问您的进程不拥有的内存并导致内存冲突

查看 max_min(),请注意 locmax 和 locmin 仅按条件分配。他们可能从未被分配到。具体来说,如果 Grades 的第一个元素也是最小元素 locmin 将永远不会被分配。它将包含它开始时的任何值。如果它从未被初始化,那将是垃圾。这就是发生的事情。

要解决此问题,请在 max_min中初始化它们。不要让它成为调用者的责任,这很容易出错。也传入size,不要使用全局。并且可能摆脱 max 和 min 参数,调用者可以从 locmin 和 locmax 中获取它们。

void max_min(int arr[], size_t size, int *locmin, int *locmax) {
    // At the start, the first element is both the max and min.
    int maxx = arr[0];
    int minx = arr[0];
    *locmax = 0;   // <<<--- initialize to the first index
    *locmim = 0;   // <<<--- initialize to the first index
    
    for (int k = 0; k < size; k++) {
        for(int i=1; i< size; i++) {
            // If current element is greater than max
            if(arr[i] > maxx) {
                maxx= arr[i];
                *locmax=i; 
            }
            // If current element is smaller than min
            if(arr[i] < minx) {
                minx= arr[i];
                *locmin=i;
            }
        }
    }
}

推荐阅读