免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2638 | 回复: 11

[C] 谈论一个问题,关于strcpy [复制链接]

论坛徽章:
0
发表于 2009-08-12 15:43 |显示全部楼层
main()
{
        char a[10]="1111111111";
        char b[13];

        strcpy(b,a,10);
        printf("%s\n",b);
}


上面的代码
没有加任何头问题件
在aix上编译的时候能通过
而且能正常运行

请问各位
这是为何

论坛徽章:
0
发表于 2009-08-12 15:48 |显示全部楼层
没有用过aix,
aix这么智能,任何文件都不用包含

论坛徽章:
0
发表于 2009-08-12 16:01 |显示全部楼层
主要是对aix不熟悉
不清楚为什么strcpy使用了三个参数
竟然也不报错
当然在加上#include <string.h>
之后
编译就报错了

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
发表于 2009-08-12 16:07 |显示全部楼层
能正常运行?我这里core了,你怎么怎么编译的

论坛徽章:
0
发表于 2009-08-12 16:18 |显示全部楼层
cc test.c
./a.out
1111111111

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
发表于 2009-08-12 16:48 |显示全部楼层

回复 #1 fish-fly 的帖子

C可以隐式声明函数原型(C99去掉了这个特性)。
你塞给它100个参数都可以……  编译时发现不了这个错误。
链接时通常也能找到strcpy函数, 链接器通常也不会检查参数不匹配的错误。


加上#include <string.h> 后, 得到strcpy的原型声明, 编译时就能发现这个错误。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
发表于 2009-08-12 17:29 |显示全部楼层
原帖由 fish-fly 于 2009-8-12 16:18 发表
cc test.c
./a.out
1111111111


我这里不行的,AIX P6

论坛徽章:
0
发表于 2009-08-12 20:11 |显示全部楼层

回复 #1 fish-fly 的帖子

加原型出错 就不用说了

不加正确也
很简单  因为 strcpy( dest, src)是这样的
所以没问题

strcpy (dest, src, n);   你这么写  是传递3个参数给strcpy
但strcpy只看见2个参数   ebp+8和ebp+12
而最后的n,     ebp+16就被丢弃了   对strcpy不会有任何影响(因为在高地址处)

在86 linux上面敢肯定是这样的 其他体系的 不清楚是如何转化为汇编的


而有的人回出错 是因为 a[10]是10个元素 所以最后的'\0'没了
因此strcpy 回一直访问a+9后面的地址 直到碰到'\0'     所以很容易挂的。。。。就算不挂
他还要copy给b 而b也就13个大小  所以  也很有可能挂。。。。


所以 楼主  你RP很高

。。。
其他挂了的都面壁去  肯定平时坏事做多了

[ 本帖最后由 snyh 于 2009-8-12 20:18 编辑 ]

论坛徽章:
0
发表于 2009-08-12 21:18 |显示全部楼层
ls的
其实我这是随便写个例子

主要是想弄清为什么编译不报错

OwnWaterloo
说的很清楚了

感谢各位

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
发表于 2009-08-13 08:56 |显示全部楼层
试了下用c99编译给警告了而不是错误。
还真没注意LZ写了10个‘1’
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP