鱼C论坛

 找回密码
 立即注册
查看: 2715|回复: 5

c strcpy问题

[复制链接]
发表于 2018-6-24 09:15:20 | 显示全部楼层 |阅读模式
5鱼币
11111.png
2222.png


strcpy  运行结果 和小甲鱼老师  结果运行 结果不一样, 是因为系统的问题吗

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

使用道具 举报

发表于 2018-6-24 10:40:09 From FishC Mobile | 显示全部楼层
你的结果是对的
小甲鱼老师的那个结果对应的不是这个代码吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-6-24 10:58:44 | 显示全部楼层
本帖最后由 关键是感觉 于 2018-6-24 16:14 编辑

你是正确的
修改回复:
不好意思开始没分析清楚说错了;

你这个代码是有问题的,结果为什么不一样非常正常;

str2长度小于str1长度

你把str1的字符串强制拷贝到str2,超出str2变量大小。覆盖到哪里本身是说不清楚的,所以值是不确定的,这个就是问题。
例如:

比如这样的问题:
        int a=0x3ff33333;
        int b=0x33333333;
        double c=1.2;
        //33 33 33 33 33 33 f3 3f
        printf("%lf",b,a);


为什么打印?a,b  会打印 结果:1.2
咋们不知道细节,用结果求推算过程。
调用printf
从右到左压栈参数 a,b "%lf"

在内存存放如下
高位在高地地址原则压入参数如下
'f'
'l'
'%'
33  内存地址 : ??
33
33
33
33
33  内存地址 : 98
f3  内存地址 : 99
3f   内存地址:100

然后printf读取第一个参数:“%lf”
%lf 表示获取一个long double大小字节的数据。33 33 33 33 33 33 f3 3f。让以浮点存储方式解读,所以打印1.2
其中,不管是函数调用从右到左入参数,还是从左到右。或者说高位放在低位内存地址。这些其实都只是概念而已,没有谁规定必须这样做,不同的系统应该有不同的处理方式,所以理解原理,不必死记硬背。
例如。有人说联想电脑好,联想电脑好。这不是绝对的,你需要看电脑的配置才能知道好坏。


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

使用道具 举报

发表于 2018-6-24 13:34:02 | 显示全部楼层
两个都是正确的,如果要深究这个问题,我需要你的反汇编代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-6-24 13:43:03 | 显示全部楼层
BngThea 发表于 2018-6-24 10:40
你的结果是对的
小甲鱼老师的那个结果对应的不是这个代码吧

你可以在linux下试一试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-6-24 23:51:05 From FishC Mobile | 显示全部楼层
Str2数组的内存空间溢出了(越界)!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 06:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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