免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3860 | 回复: 10
打印 上一主题 下一主题

看 《K&R C》Pointers and Arrays 模拟strcpy函数突然想到的 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-05 14:29 |只看该作者 |倒序浏览
  看第五章指针与数组的时候关于模拟库函数strcpy(char *s,char *t)的时候,我突然想到一个问题(菜鸟,大神别笑),那就是如果t存了一个很长长的字符串,当我们用*s++=*t++的时候,如果当初s分配的地址距离t的地址的区间小于t的长度,会不会发生s覆盖t的情况?

实际修改了下书上的例子,发现我的担心好像是多余的
代码
#include <stdio.h>

void strcpy(char *,char *);

main()
{
        char *s;
        char *t="I love you";
        strcpy(s,t);
}

void strcpy(char *s,char *t)
{
        int i;
        i=0;
       
        while(*s++=*t++!='\0')
        {
                printf("%p\n",s);
                printf("%p\n",t);
        }
}

结果
0x7ffff1b4a561
0x400629
0x7ffff1b4a562
0x40062a
0x7ffff1b4a563
0x40062b
0x7ffff1b4a564
0x40062c
0x7ffff1b4a565
0x40062d
0x7ffff1b4a566
0x40062e
0x7ffff1b4a567
0x40062f
0x7ffff1b4a568
0x400630
0x7ffff1b4a569
0x400631
0x7ffff1b4a56a
0x400632

貌似这两个变量的地址差的很远。。。。

接着我又改了一下上面的程序
代码
#include <stdio.h>

main()
{
        char *s;
        char *t;
        printf("%p\n",s);
        printf("%p\n",t);
}

结果
0x7fff59599fb0
(nil)

t的地址是空,得到上面例子的结果的时候,我在猜是不是编译器会给初始化和没有初始化的变量分配相隔很远的地址(可能是代码区,数据区之类的),以免我说的上面的情况出现,但是第二个例子的结果我又晕了?

论坛徽章:
0
2 [报告]
发表于 2012-07-05 14:38 |只看该作者
本帖最后由 龙骨五钱 于 2012-07-05 14:41 编辑

编译器会保证不会出现这样的情况的,因为你分配内存时需要指定大小,是吧?
第一个例子,s都没初始化你就用??

论坛徽章:
0
3 [报告]
发表于 2012-07-05 14:40 |只看该作者
但是他不一定知道我定义一个char *t就是为了复制s呀?回复 2# 龙骨五钱


   

论坛徽章:
0
4 [报告]
发表于 2012-07-05 14:40 |只看该作者
本帖最后由 龙骨五钱 于 2012-07-05 14:42 编辑

你的第二个例子,不就是两个变量没有初始化吗?没有初始化的话变量的值不是不确定的吗?这有什么不好理解的??

论坛徽章:
0
5 [报告]
发表于 2012-07-05 14:41 |只看该作者
本帖最后由 龙骨五钱 于 2012-07-05 14:42 编辑
xiaowh00 发表于 2012-07-05 14:40
但是他不一定知道我定义一个char *t就是为了复制s呀?回复 2# 龙骨五钱

你的s都没初始化。

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
6 [报告]
发表于 2012-07-05 14:49 |只看该作者
do you menas that:

  1. #include <stdio.h>
  2. #include<string.h>
  3. int main(){
  4.         long endstring=0;
  5.         char sdes[256];        // Hight address@x86
  6.         char ssrc[2]={0};        // Low address@x86
  7.         for(int iChar=0;iChar<(sizeof(sdes)/sizeof(sdes[0]));iChar++) sdes[iChar]='.';
  8.         printf("Before overwriting: %s\n",sdes);
  9.         strcpy(ssrc,"It is a test");
  10.         printf("After overwrote: %s\n",sdes);
  11.         return 0;
  12. }
复制代码

论坛徽章:
0
7 [报告]
发表于 2012-07-05 15:04 |只看该作者
folklore 发表于 2012-07-05 14:49
do you menas that:

他可能只是不明白字符串的原理。

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
8 [报告]
发表于 2012-07-05 15:18 |只看该作者
内存覆盖吗?

论坛徽章:
0
9 [报告]
发表于 2012-07-05 17:25 |只看该作者
我的意思是用来存放结果的指针分配的地址增加后,有没有可能会覆盖s分配的地址,没看懂你的代码要做什么。。。回复 6# folklore


   

论坛徽章:
0
10 [报告]
发表于 2012-07-05 17:27 |只看该作者
是,就是当s的指针不断增加的过程中,有没有可能覆盖t中原来的数据,还是有什么机制保证不可能发生这种情况,还是我还没搞懂指针的内涵?s回复 8# mirnshi


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP