鱼C论坛

 找回密码
 立即注册
查看: 2603|回复: 8

请教关于结果不一致的问题。

[复制链接]
发表于 2020-1-5 15:15:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 ad1949 于 2020-1-6 10:06 编辑

请教各位,下面的程序是要将数组source中的值拷贝到target2和targete3中。但是,为何在main中运行的结果和在函数copy_ptrs()中运行的结果不一致?
正确代码,请见6楼。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-1-5 15:16:00 | 显示全部楼层
本帖最后由 ad1949 于 2020-1-5 15:39 编辑

这是我2020年1月5日在win7的Notepad++中的运行结果:
***********************************************
source[0] = 1.10, target3[0] = 1.10
source[1] = 2.20, target3[1] = 2.20
source[2] = 3.30, target3[2] = 3.30
source[3] = 4.40, target3[3] = 4.40
source[4] = 5.50, target3[4] = 5.50

这是在copy_ptrs的运行结果:
source[0] = 2.20, target2[0] = 1874562648124774700000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000.00
source[1] = 4.40, target2[1] = 0.00
source[2] = 0.00, target2[2] = 1.10
source[3] = 19100362997051503000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000.00, target2[3] = 3.30
source[4] = 0.00, target2[4] = 5.50
***********************************************
从计算的结果可以看出:
1.执行main中的赋值运算后,成功拷贝了source中的值,但是,根据语法推断的话,应该是错误的;
2.执行copy_ptrs()后,显示并未成功拷贝source中的值,但是,这个结果应该符合语法的规则。
***********************************************

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-5 16:11:14 | 显示全部楼层
发代码点"<>"符号发代码,
都看不清你写了啥
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-5 16:40:04 | 显示全部楼层
  1. #include <stdio.h>
  2. void copy_ptrs(double *target3, double *source, int n);

  3. int main(void)
  4. {
  5.         double source[5] = {1.1, 2.2, 3.3, 4.4, 5.5};
  6.         double target2[5];
  7.         double target3[5];
  8.         double * p_source;
  9.         double * p_target3;        
  10.         
  11.         p_source = source;
  12.         p_target3 = target3;
  13.         for(int i = 0; (p_source + i) < p_source + 5; i++)
  14.         {
  15.                 *(p_target3++) = *(p_source++);   //这里的计算结果是正确的。。?
  16.                 printf("source[%d] = %.2f, target3[%d] = %.2f\n", i, source, i, target3);
  17.         }
  18.         printf("\n");
  19.         
  20.         copy_ptrs(target2, source, 5);
  21.                
  22.         return 0;
  23. }

  24. void copy_ptrs(double *target2, double *source, int n)
  25. {
  26.         for(int i = 0; (source + i) < source + n; i++)
  27.         {
  28.                 *(target2++) = *(source++);   //error,???
  29.                 printf("source[%d] = %.2f, target2[%d] = %.2f\n", i, source, i, target2);
  30.         }
  31.                
  32.         return;
  33. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-5 16:40:49 | 显示全部楼层
Croper 发表于 2020-1-5 16:11
发代码点""符号发代码,
都看不清你写了啥

不好意思。。。
新人,不知道怎么弄。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-5 17:13:32 | 显示全部楼层
你确定这是你原来的代码么。。?
我怎么觉得原来的代码是这样的呢?
  1. [quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=4263719&ptid=153432][color=#999999]ad1949 发表于 2020-1-5 16:40[/color][/url][/size]
  2. 不好意思。。。
  3. 新人,不知道怎么弄。。。[/quote]

  4. #include <stdio.h>
  5. void copy_ptrs(double *target3, double *source, int n);

  6. int main(void)
  7. {
  8.         double source[5] = {1.1, 2.2, 3.3, 4.4, 5.5};
  9.         double target2[5];
  10.         double target3[5];
  11.         double * p_source;
  12.         double * p_target3;        
  13.         
  14.         p_source = source;
  15.         p_target3 = target3;
  16.         for(int i = 0; (p_source + i) < p_source + 5; i++)
  17.         {
  18.                 *(p_target3++) = *(p_source++);   //这里的计算结果是正确的。。?
  19.                 printf("source[%d] = %.2f, target3[%d] = %.2f\n", i, source[i], i, target3[i]);
  20.         }
  21.         printf("\n");
  22.         
  23.         copy_ptrs(target2, source, 5);
  24.                
  25.         return 0;
  26. }

  27. void copy_ptrs(double *target2, double *source, int n)
  28. {
  29.         for(int i = 0; (source + i) < source + n; i++)
  30.         {
  31.                 *(target2++) = *(source++);   //error,???
  32.                 printf("source[%d] = %.2f, target2[%d] = %.2f\n", i, source[i], i, target2[i]);
  33.         }
  34.                
  35.         return;
  36. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-5 17:18:41 | 显示全部楼层
我觉得你代码贴错了,因为你后来贴的代码跟你的描述根本不一致。。
我按我估计的来回答:

在函数copy_ptrs中,你的source和target指针的指向在for循环中值已经改变,那么source[ i]就不是原来的source[ i]了,你可以考虑改成
  1. void copy_ptrs(double *target2, double *source, int n)
  2. {
  3.         for(int i = 0; (source + i) < source + n; i++)
  4.         {
  5.                 *(target2++) = *(source++);   //error,???
  6.                 printf("source[%d] = %.2f, target2[%d] = %.2f\n", i, source[-1], i, target2[-1]);
  7.         }
  8.                
  9.         return;
  10. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-6 07:45:06 | 显示全部楼层
本帖最后由 ad1949 于 2020-1-6 07:49 编辑
Croper 发表于 2020-1-5 17:18
我觉得你代码贴错了,因为你后来贴的代码跟你的描述根本不一致。。
我按我估计的来回答:

先谢谢大佬,你猜测的那个很对。我又试了一下,不知道第一次复制的时候是怎么弄的?没把复制上。。。
不知道为啥“【i】”打不出来。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-6 08:01:46 | 显示全部楼层
本帖最后由 ad1949 于 2020-1-6 10:14 编辑
Croper 发表于 2020-1-5 17:18
我觉得你代码贴错了,因为你后来贴的代码跟你的描述根本不一致。。
我按我估计的来回答:


大佬,你给的答案运行结果没问题。
不过我有三个疑问1.根据你6楼的帖子,为什么main中的18到22行和copy_ptrs中的32-36行代码是一样的,但是运行结果不一样?
2.根据语法规则的话*(target2++) = *(source++); 这个表达式,在执行完第一次的结果不应该是这样么?
1)先将target2[0]指向target2[1],将source[0]指向source[1];
2)将source[1]的值赋给target2[1]。
3)所以target2[0]的值不应该是垃圾值么?而target2[1]中的值不应该是2.2么?
3.大佬你的数组下标用负数,是为啥?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-1 05:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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