VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 329|回复: 7

[已解决]求助,在函数的默认参数这里出错了

[复制链接]
61_avatar_middle
最佳答案
0 
在线会员 发表于 2020-8-7 10:37:31 | 显示全部楼层 |阅读模式
#include <iostream>
using namespace std;

void get_min_max(int src[], int arr_len, int* max_v = NULL, int* min_v = NULL)
{
        if (arr_len < 0 || (!max_v && !min_v)) return;

                int min_value = src[0];
                int max_value = src[0];
        for (int i = 1; i < arr_len; ++i)
        {
                        if (min_value > src[i]) min_value = src[i];
                        if (max_value < src[i]) max_value = src[i];
        }
        if (min_value) *min_v = min_value;
        if (max_value) *max_v = max_value;
}
int main()
{
        int src[] = { 66, 33, 55, 22, 88, 89, 19 };
        int max_v = 0;
        get_min_max(src, sizeof(src) / sizeof(int), &max_v);

        cout << "max_v = " << max_v << endl;

        return 0;
}

一运行就说:exe已停止工作。
调试时:引发了异常: 写入访问权限冲突。min_v 是 nullptr。
求大家帮忙看看要怎么改?
最佳答案
74_avatar_small
2020-8-7 13:11:48
本帖最后由 User_Ghost 于 2020-8-7 13:19 编辑
gkz525 发表于 2020-8-7 12:06
我只想要最大值,不想要最小值


您是说只要最大值,所以才只传入接收最大值的变量

但是函数在执行的时候,注意一下下边代码的1012行,min_value和max_value是函数的局部变量,也就是说,做完了for循环以后,min_value和max_value已经分别得到最小值和最大值。但是,你的if语句却是用这两个最值作为判断,那么只要两个最值不为0,if语句都会执行该句的代码。

而您只想要最大值,所以没有传入接受最小值的地址,默认参数为NULL,也就是空地址。此时注意上边讲的话,您用的是最值局部变量作为判断,只要不为0都会执行,做完for循环以后,两个变量可能都不为0,那执行到 if (min_value)以后,就会做这句的代码块,但是没有传入min_v的地址,所以为空地址,那你说说空地址能用来读写吗?所以程序才会报错。我估计您是打错了代码,if里面应当是对两个指针变量地址的空地址判断,也就是if ( min_v != NULL ) 和 if ( max_v != NULL )
  1. void get_min_max(int src[], int arr_len, int *max_v = NULL, int *min_v = NULL)
  2. {
  3.     if (arr_len < 0 || (!max_v && !min_v))
  4.         return;

  5.     int min_value = src[0];
  6.     int max_value = src[0];
  7.     for (int i = 1; i < arr_len; ++i)
  8.     {
  9.         if (min_value > src[i])
  10.             min_value = src[i];
  11.         if (max_value < src[i])
  12.             max_value = src[i];
  13.     }
  14.     if (min_value)
  15.         *min_v = min_value;
  16.     if (max_value)
  17.         *max_v = max_value;
  18. }
复制代码


关于您说只想要最大值不想要最小值。总而言之,您只想要最大值,没打算要最小值,而函数却帮你算出了最小值,又因为判断标准错误,对空地址读写,才导致程序崩溃的。

另外,您可以尝试在数组里加上0,然后程序也可以正常运行




上一篇:不知道哪出错了,调试了快1小时看不出问题qwq
下一篇:关于网络方面
74_avatar_middle
最佳答案
3 
在线会员 发表于 2020-8-7 13:11:48 | 显示全部楼层    本楼为最佳答案   
bestAnswer
本帖最后由 User_Ghost 于 2020-8-7 13:19 编辑
gkz525 发表于 2020-8-7 12:06
我只想要最大值,不想要最小值


您是说只要最大值,所以才只传入接收最大值的变量

但是函数在执行的时候,注意一下下边代码的1012行,min_value和max_value是函数的局部变量,也就是说,做完了for循环以后,min_value和max_value已经分别得到最小值和最大值。但是,你的if语句却是用这两个最值作为判断,那么只要两个最值不为0,if语句都会执行该句的代码。

而您只想要最大值,所以没有传入接受最小值的地址,默认参数为NULL,也就是空地址。此时注意上边讲的话,您用的是最值局部变量作为判断,只要不为0都会执行,做完for循环以后,两个变量可能都不为0,那执行到 if (min_value)以后,就会做这句的代码块,但是没有传入min_v的地址,所以为空地址,那你说说空地址能用来读写吗?所以程序才会报错。我估计您是打错了代码,if里面应当是对两个指针变量地址的空地址判断,也就是if ( min_v != NULL ) 和 if ( max_v != NULL )
  1. void get_min_max(int src[], int arr_len, int *max_v = NULL, int *min_v = NULL)
  2. {
  3.     if (arr_len < 0 || (!max_v && !min_v))
  4.         return;

  5.     int min_value = src[0];
  6.     int max_value = src[0];
  7.     for (int i = 1; i < arr_len; ++i)
  8.     {
  9.         if (min_value > src[i])
  10.             min_value = src[i];
  11.         if (max_value < src[i])
  12.             max_value = src[i];
  13.     }
  14.     if (min_value)
  15.         *min_v = min_value;
  16.     if (max_value)
  17.         *max_v = max_value;
  18. }
复制代码


关于您说只想要最大值不想要最小值。总而言之,您只想要最大值,没打算要最小值,而函数却帮你算出了最小值,又因为判断标准错误,对空地址读写,才导致程序崩溃的。

另外,您可以尝试在数组里加上0,然后程序也可以正常运行
74_avatar_middle
最佳答案
3 
在线会员 发表于 2020-8-7 11:28:13 | 显示全部楼层
本帖最后由 User_Ghost 于 2020-8-7 11:31 编辑

这一句,你传入参数的时候没有传入min_v,所以是NULL,但是你的min_value可能并不为0,而min_v又可能为NULL
  1. if (min_value)
  2.         *min_v = min_value;
复制代码


改的话,我不知道你想要什么。我这是解决上边问题后可以运行,不会报错
可能的话,可以对两个指针变量判断一下是否为空地址,然后就可以正常运行了

评分

参与人数 1威望 +2 驿站币 +2 热心值 +2 收起 理由
51_avatar_small Syc + 2 + 2 + 2 赞一个!

查看全部评分

70_avatar_middle
最佳答案
49 
在线会员 发表于 2020-8-7 11:41:08 | 显示全部楼层
你 min_v  就没传啊,可不是nullptr吗
61_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-8-7 11:59:35 来自手机 | 显示全部楼层
tony666 发表于 2020-8-7 11:41
你 min_v  就没传啊,可不是nullptr吗

我不想要最小值min,所以NULL不用传入也是可以的啊
61_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-8-7 12:06:27 来自手机 | 显示全部楼层
User_Ghost 发表于 2020-8-7 11:28
这一句,你传入参数的时候没有传入min_v,所以是NULL,但是你的min_value可能并不为0,而min_v又可能为NULL ...

我只想要最大值,不想要最小值
61_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-8-7 15:48:43 | 显示全部楼层
User_Ghost 发表于 2020-8-7 13:11
您是说只要最大值,所以才只传入接收最大值的变量

但是函数在执行的时候,注意一下下边代码的10和12 ...

谢谢你,已解决
61_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-8-7 15:50:02 | 显示全部楼层
tony666 发表于 2020-8-7 11:41
你 min_v  就没传啊,可不是nullptr吗

好的,谢谢你
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2021-10-27 14:01

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表