C 代码在到达swap函数后停止,如果我对其进行注释,它将完美地工作
代码在到达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
#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。