鱼C论坛

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

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

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

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

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

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

请教各位,下面的程序是要将数组source中的值拷贝到target2和targete3中。但是,为何在main中运行的结果和在函数copy_ptrs()中运行的结果不一致?
正确代码,请见6楼。
想知道小甲鱼最近在做啥?请访问 -> 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中的值,但是,这个结果应该符合语法的规则。
***********************************************

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-5 16:11:14 | 显示全部楼层
发代码点"<>"符号发代码,
都看不清你写了啥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

int main(void)
{
        double source[5] = {1.1, 2.2, 3.3, 4.4, 5.5};
        double target2[5];
        double target3[5];
        double * p_source;
        double * p_target3;        
        
        p_source = source;
        p_target3 = target3;
        for(int i = 0; (p_source + i) < p_source + 5; i++)
        {
                *(p_target3++) = *(p_source++);   //这里的计算结果是正确的。。?
                printf("source[%d] = %.2f, target3[%d] = %.2f\n", i, source, i, target3); 
        }
        printf("\n");
        
        copy_ptrs(target2, source, 5);
                
        return 0;
}

void copy_ptrs(double *target2, double *source, int n)
{
        for(int i = 0; (source + i) < source + n; i++)
        {
                *(target2++) = *(source++);   //error,???
                printf("source[%d] = %.2f, target2[%d] = %.2f\n", i, source, i, target2); 
        }
                
        return;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

不好意思。。。
新人,不知道怎么弄。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

int main(void)
{
        double source[5] = {1.1, 2.2, 3.3, 4.4, 5.5};
        double target2[5];
        double target3[5];
        double * p_source;
        double * p_target3;        
        
        p_source = source;
        p_target3 = target3;
        for(int i = 0; (p_source + i) < p_source + 5; i++)
        {
                *(p_target3++) = *(p_source++);   //这里的计算结果是正确的。。?
                printf("source[%d] = %.2f, target3[%d] = %.2f\n", i, source[i], i, target3[i]); 
        }
        printf("\n");
        
        copy_ptrs(target2, source, 5);
                
        return 0;
}

void copy_ptrs(double *target2, double *source, int n)
{
        for(int i = 0; (source + i) < source + n; i++)
        {
                *(target2++) = *(source++);   //error,???
                printf("source[%d] = %.2f, target2[%d] = %.2f\n", i, source[i], i, target2[i]); 
        }
                
        return;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

在函数copy_ptrs中,你的source和target指针的指向在for循环中值已经改变,那么source[ i]就不是原来的source[ i]了,你可以考虑改成
void copy_ptrs(double *target2, double *source, int n)
{
        for(int i = 0; (source + i) < source + n; i++)
        {
                *(target2++) = *(source++);   //error,???
                printf("source[%d] = %.2f, target2[%d] = %.2f\n", i, source[-1], i, target2[-1]);
        }
               
        return;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

先谢谢大佬,你猜测的那个很对。我又试了一下,不知道第一次复制的时候是怎么弄的?没把复制上。。。
不知道为啥“【i】”打不出来。。。
想知道小甲鱼最近在做啥?请访问 -> 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.大佬你的数组下标用负数,是为啥?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-5 05:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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