c - 代码在达到交换功能后停止,如果我将其注释掉,它会完美运行
问题描述
代码在到达交换函数后中断并且不再运行,即使如果我将其注释掉它也可以工作,而且我看不出它为什么停止工作的问题。
#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;
}
解决方案
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;
}
}
}
}
推荐阅读
- java - 循环通过firebase时的空指针
- android - 迁移到 androidx 后,我的应用程序一直在模拟器中关闭。有人对此有解决方案吗?
- python - 熊猫 groupby 并删除重复项
- javascript - 使用现有属性值添加新 JSON 属性
- django - 注释在不存在的值上返回 null,我想将其转换为 null 为空字符串
- c# - EF Core 3.0:具有大量数据的重复插入
- c++ - 在 C++ 中初始化时会发生什么
- javascript - PowerBI 自定义视觉对象 - 如何使用 PowerBI API 以编程方式在自定义视觉对象中的报表页面之间切换?
- ruby - 悬停在按钮上
- scala - 如何通过代理使用 coursier