Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 代码在到达swap函数后停止,如果我对其进行注释,它将完美地工作_C - Fatal编程技术网

C 代码在到达swap函数后停止,如果我对其进行注释,它将完美地工作

C 代码在到达swap函数后停止,如果我对其进行注释,它将完美地工作,c,C,代码在到达swap函数后会中断并不再运行,即使我对其进行了注释,它仍然可以工作,而且我不知道为什么它会停止工作 #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

代码在到达swap函数后会中断并不再运行,即使我对其进行了注释,它仍然可以工作,而且我不知道为什么它会停止工作

#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;
}
#包括
#定义尺寸10
无效交换(整数*最大值,整数*最小值)//将最大值位置与最小值位置互换
void max_min(int arr[],int*max,int*min,int*locmin,int*locmax);
int main()
{
智力等级[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);//获取最大最小值及其位置
printf(“最大坡度%d\n最小坡度%d\n”,最大,最小);
交换(&grades[locmax],&grades[locmin]);//仅交换最小值和最大值
}      
无效交换(整数*最大值,整数*最小值)
{
内部温度=*最大值;
*最大值=*最小值;
*最小值=温度;
}    
无效最大值最小值(int arr[],int*max,int*min,int*locmin,int*locmax)
{
int-maxx,minx;
maxx=arr[0];
minx=arr[0];

对于(int k=0;k我必须给两个locmin和locmax的初始值均为零,然后程序开始工作。
我不知道这是否与C有关,但这是我第一次遇到这样的问题。

locmin和locmax从未初始化过,既不是通过main也不是通过max\u min。结果是它们将包含当时内存中的任何垃圾。如果幸运的话,它将是0,但可能是任何东西。这可能会导致locmin或locmax超出了grades数组的界限。它们小于0或大于9。因此
grades[locmin]
grades[locmax]
尝试访问进程不拥有的内存,并导致错误

看着max_min(),请注意,locmax和locmin仅被有条件地分配给。它们可能从未被分配给。具体地说,如果等级的第一个元素也是最小的元素,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;
            }
        }
    }
}
void max\u min(int arr[],size\u t size,int*locmin,int*locmax){
//在开始时,第一个元素是max和min。
int maxx=arr[0];
int minx=arr[0];

*locmax=0;//请提供完整的代码作为。但在此之前,建议您进行基本调试。在调试器中运行您的程序。在运行时检查所有变量的值,特别是任何数组索引。请显示
maxmin
的代码,最好是作为a的一部分。很可能,
max
和/或
min
是超出范围。如果有错误,请提供编译器输出。请解释“停止工作”的含义您必须强制停止执行吗?它会崩溃并输出错误吗?是的,除非您对它们进行初始化,否则变量将包含当时内存中出现的任何垃圾。我们需要查看
max\u min
以了解假设变量已初始化的内容。这可能导致locmax和locmin包含的值完全错误级别数组的范围,并尝试访问
grades[locmax]
grades[locmin]
导致出现错误。感谢您提供的信息,我将在提交的代码中添加max\u min函数。这很难理解。请问,
size
来自何处?我在编辑代码时遇到问题,因为StackOverflow是如何工作的这是我第一次使用它,所以我还有很长的路要走。我把我的同事如果您想查看,请在此删除,再次感谢您的帮助和解释。()因此基本上locmin包含一个垃圾值,因为最小的值在my arr[0]中,因此,通常最好为此类变量指定一个0值。我将致力于为此类问题进行更好的调用+不使用全局变量,感谢提供的有用信息。@Lutfi是的,您已经知道了。在C中,您必须自己进行初始化。一个好的编译器会警告您未初始化的变量。您可以如果您确定变量在读取之前会被覆盖,则不必总是初始化变量。例如,如果max_min会初始化,则main不必初始化locmin和locmax。