VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 741|回复: 7

指针连续用两次怎么就变了

[复制链接]
83_avatar_middle
最佳答案
0 
在线会员 发表于 2021-8-12 19:01:47 | 显示全部楼层 |阅读模式
指针连续用两次怎么就变了file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\153613853\QQ\WinTemp\RichOle\(JQC4FVS`CU@Z5`ET2KW4Q5.png[img]file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\153613853\QQ\WinTemp\RichOle\05_SMHZ73[U$UMPE6XNDDL6.png[/img]file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\153613853\QQ\WinTemp\RichOle\WT3F06DRU8I%OG70SRZIOXK.pngfile:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\153613853\QQ\WinTemp\RichOle\$FD)8~LC3R25X_WW610SOZB.png





上一篇:为什么函数中形参是char *型
下一篇:该怎么使用CButtonST呀
31_avatar_middle
最佳答案
62 
在线会员 发表于 2021-8-13 13:08:09 | 显示全部楼层
本帖最后由 cpp2019 于 2021-8-13 13:52 编辑
Mr.Tian 发表于 2021-8-12 19:15
图片没传上去 总之就是代码是这样的
int * max_min(int x[], int size)
{


来一块儿玩花活
  1. #include <iostream>
  2. using namespace std;

  3. typedef struct _RESULT
  4. {
  5.         int num[2]{ 0 };
  6. }RESULT;

  7. template<typename T1, typename T2, typename T3>
  8. auto Test(T1 x[], T2 size, T3 t) ->decltype(auto)
  9. {
  10.         T1 max = 0, min = 1;
  11.         for (int i = 0; i < size; i++)
  12.         {
  13.                 max = max < x[i] ? x[i] : max;
  14.                 min = min > x[i] ? x[i] : min;
  15.         }
  16.         decltype(t) res;
  17.         res.num[0] = max;
  18.         res.num[1] = min;
  19.         return res;
  20. }

  21. int main() {

  22.         int array[] = { 5, 8, 3, 0, 1, 2, 4, 7, 6, 9 };
  23.         int size = sizeof(array) / sizeof(int);

  24.         RESULT r;
  25.         r = Test(array, size, r);
  26.         cout << "max=" << r.num[0] << " min=" << r.num[1] << "\n";

  27.         short array2[] = { 4, 8, 2, 0, 1, 3, 5, 7, 6, 9 };
  28.         size = sizeof(array2) / sizeof(short);

  29.         RESULT r1;
  30.         r1 = Test(array2, size, r1);
  31.         cout << "max=" << r1.num[0] << " min=" << r1.num[1] << "\n";

  32.         return 0;
  33. }
复制代码


正常的写法:
  1. #include <iostream>
  2. using namespace std;

  3. int *q = nullptr;

  4. #pragma warning(disable:4146)
  5. int * max_min(int x[], int size)
  6. {
  7.         int max = -2147483648, min = 2147483647;
  8.         for (int i = 0; i < size; i++)
  9.         {
  10.                 max = max < x[i] ? x[i] : max;
  11.                 min = min > x[i] ? x[i] : min;

  12.         }
  13.         int *num = new int[2]{ max, min };

  14.         return num;
  15. }

  16. void onExit()
  17. {
  18.         if (nullptr != q)
  19.         {
  20.                 delete []q;
  21.                 q = nullptr;
  22.         }
  23. }

  24. int main() {

  25.         atexit(onExit);

  26.         int apple4[10] = { 5, 8, 3, 0, 1, 2, 4, 7, 6, 9 };
  27.         int size = end(apple4) - begin(apple4);
  28.         q = max_min(apple4, size);
  29.         cout << "max=" << *q <<" max=" << *(q+1) << endl;
  30.         cout << "max=" << *q <<" max=" << *(q+1) << endl;
  31.         cout << "max=" << *q <<" max=" << *(q+1) << endl;
  32.         cout << "max=" << *q <<" max=" << *(q+1) << endl;
  33.         cout << "max=" << q[0] <<" max=" << q[1] << endl;
  34.         cout << "max=" << q[0] <<" max=" << q[1] << endl;
  35.         cout << "max=" << q[0] <<" max=" << q[1] << endl;

  36.         return 0;
  37. }
复制代码

评分

参与人数 1驿站币 +2 热心值 +2 收起 理由
58_avatar_small thzzl + 2 + 2 很给力!

查看全部评分

83_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-8-12 19:15:42 | 显示全部楼层
图片没传上去 总之就是代码是这样的
int * max_min(int x[], int size)
{
        int max = -2147483648, min = 2147483647;
        for (int i = 0; i < size; i++)
        {
                max = max < x[i] ? x[i] : max;
                min = min > x[i] ? x[i] : min;

        }
        int num[2] = { max, min };
        return num;
}
        int apple4[10] = { 5, 8, 3, 0, 1, 2, 4, 7, 6, 9 };
        int size = end(apple4) - begin(apple4);
        int *q = max_min(apple4, size);//调用返回数组的函数返回的为地址,要再使用指针
        cout << "max=" << *q << endl;
        cout << "max=" << *q << endl;
结果是9和-858993460
74_avatar_middle
最佳答案
7 
在线会员 发表于 2021-8-12 21:25:05 | 显示全部楼层
这个代码是有问题的,虽然编译通过了,但实际上是不合理的。
就是那个num,定义在函数内部,是局部变量,等函数返回时,那段内存就会释放,而你之后的q指向了一段已经被释放的内存,确实能访问,只是数据没了。

但是为什么又能获得到9这一个数据呢?(包括我自己也跑了几次,32位情况下,会无规律的在正确结果和输出9、512之间徘徊)一开始我以为是cout的原因,但是后来又找不出cout的问题,就调试了一下,然后就发现了下边这些东西。

所以,我得出的结论就是,函数在返回后,其使用的内存会被释放,但是似乎为了不让主线程因为释放而假死,可能是在后台进行了,并且有一定延迟,这就导致你对q取值的时候,凭运气在释放前取到了,而第二次可能就是已经被释放了,所以取到了错误数据。(只是我自己认为的,具体的有待其他有技术的人解决)

(以下是64位debug模式下)
指针连续用两次怎么就变了
你看哈,断点设在这。然后跳进max_min函数里

指针连续用两次怎么就变了
包括到这里都是没问题的。

然后把地址复制到内存窗口去
指针连续用两次怎么就变了
到现在为止确实没问题,num这个地址存的确实是9,紧接着的是0

然后你看,这边的内存成了什么
指针连续用两次怎么就变了
很明显这段内存已经被清理了


评分

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

查看全部评分

31_avatar_middle
最佳答案
62 
在线会员 发表于 2021-8-12 21:59:11 | 显示全部楼层
return num; 返回是的局部变量,离开了max_min函数随便会被清理,这就是你说的“用两次怎么就变了”的原因。

最简单的方法就是声明一个全局数组来保存结果。

一定要返回数组的话就在堆上申请指针数组。
31_avatar_middle
最佳答案
62 
在线会员 发表于 2021-8-13 13:18:58 | 显示全部楼层
User_Ghost 发表于 2021-8-12 21:25
这个代码是有问题的,虽然编译通过了,但实际上是不合理的。
就是那个num,定义在函数内部,是局部变量, ...


返回的时候确实返回了正确的结果,你之所以只看到一个9是因为用法的问题.
指针连续用两次怎么就变了

  1. #include <iostream>
  2. using namespace std;

  3. #pragma warning(disable:4146)
  4. int * max_min(int x[], int size)
  5. {
  6.         int max = -2147483648, min = 2147483647;
  7.         for (int i = 0; i < size; i++)
  8.         {
  9.                 max = max < x[i] ? x[i] : max;
  10.                 min = min > x[i] ? x[i] : min;

  11.         }
  12.         int num[2] = { max, min };
  13.         return num;
  14. }

  15. int main() {

  16.         int apple4[10] = { 5, 8, 3, 0, 1, 2, 4, 7, 6, 9 };
  17.         int size = end(apple4) - begin(apple4);
  18.         int *q = max_min(apple4, size);
  19.         cout << "max=" << *q <<" max=" << *(q+1) << endl;
  20.         // 第二次调用时数据就可能没了
  21.         //cout << "max=" << *q <<" max=" << *(q+1) << endl;

  22.         return 0;
  23. }
复制代码

评分

参与人数 1驿站币 +2 热心值 +2 收起 理由
58_avatar_small thzzl + 2 + 2 很给力!

查看全部评分

74_avatar_middle
最佳答案
7 
在线会员 发表于 2021-8-13 13:32:18 | 显示全部楼层
cpp2019 发表于 2021-8-13 13:18
返回的时候确实返回了正确的结果,你之所以只看到一个9是因为用法的问题.

这个我知道,问题在于只能用一次,可惜是凭运气的,而且如果在调用前用Sleep延迟一会,再调用就错了。
所以我觉得内存释放可能是交给系统去做了,但是有一定延迟,所以刚好第一次调用的时候还没有被释放。

但是又有一个问题,我用32位调试的时候有时候是会出现正确答案。但是64位的情况下就不行,一直都是错误的。所以我在想是不是64位的程序有优化,内存释放的快些。

另外,感谢指导!
31_avatar_middle
最佳答案
62 
在线会员 发表于 2021-8-13 13:34:48 | 显示全部楼层
User_Ghost 发表于 2021-8-13 13:32
这个我知道,问题在于只能用一次,可惜是凭运气的,而且如果在调用前用Sleep延迟一会,再调用就错了。
...

谈不上指导,共同学习!
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

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

关闭

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

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

GMT+8, 2023-9-29 18:40

Powered by CcTry.CoM

© 2009-2021 cctry.com

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