CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

strcpy 指针问题

楼主freememe()2005-04-01 00:34:46 在 C/C++ / C语言 提问

#include   "stdio.h"  
  #include   "string.h"  
  void   main()  
  {  
    char   *p="abcdefg";  
    p++;  
    printf("%d",strlen(strcpy(p,"ABCD")));  
  }  
  答案:4  
   
  为什么p++;  
  printf("%d",strlen(strcpy(p,"ABCD")));   为什么这句中的p指针没有往后移动 问题点数:0、回复次数:28Top

1 楼cssin(Steven Liu)回复于 2005-04-01 01:18:43 得分 0

strcpy会把字符串末尾的'\0'同时拷贝的,而当函数strlen发现'\0'即停止计算了,所以答案自然是4了Top

2 楼cssin(Steven Liu)回复于 2005-04-01 01:20:31 得分 0

另外你可以把printf该成下面的代码试试  
  printf("%s\t%d\n",   p,   strlen(p));Top

3 楼ALAN_1999(试试看:))回复于 2005-04-01 03:24:37 得分 0

改成如下这样怎么样?  
   
  #include   "stdio.h"  
  #include   "string.h"  
  void   main()  
  {  
    char   *p="abcdefg";  
    strcpy(p,"ABCD");  
    p++;  
    printf("%d",strlen(p));  
  }  
   
   
  Top

4 楼sapphirez()回复于 2005-04-01 07:18:01 得分 0

strcpy只Copy到'\0'为止,它表示字符串的结束Top

5 楼MagicCarmack(MagiC++)回复于 2005-04-01 08:03:43 得分 0

楼主你的程序能运行么??  
   
  我在Dev-C++   4.9.9中是不能运行的  
   
  char   *p="abcdefg";  
    strcpy(p,"ABCD");  
  这样做能行吗??  
  Top

6 楼kobefly(科比--网络学习中)回复于 2005-04-01 08:43:16 得分 0

char   *p="abcdefg";  
    strcpy(p,"ABCD");  
  这样做能行吗??  
   
  这段代码当然不行拉  
  p指向常量字符串的啊  
   
  怎么可以strcpy呢  
  Top

7 楼skywgs(浪迹天涯)回复于 2005-04-01 08:51:51 得分 0

在TC里能运行,而且是对的,在VC6.0里执行到strcpy(p,"ABCD");就出错:内存不可写!!!Top

8 楼zhousqy(标准C匪徒)(甩拉,甩拉)回复于 2005-04-01 08:54:01 得分 0

char   *p="abcdefg";  
    strcpy(p,"ABCD");  
  这样做能行吗??  
   
  这段代码当然不行拉  
  p指向常量字符串的啊  
   
  怎么可以strcpy呢  
  ===========  
  同意。Top

9 楼ptb1212(天狗)回复于 2005-04-01 09:01:55 得分 0

char   *p="abcdefg";  
    strcpy(p,"ABCD");  
  这样做能行吗??  
   
  这段代码当然不行拉  
  p指向常量字符串的啊  
   
  怎么可以strcpy呢  
  ===========  
  这是不可以的  
  用strcpy前必须保证p有空间,也就是需要用数组定义或者用malloc申请Top

10 楼herrycsdn(卓一凡)回复于 2005-04-01 09:38:05 得分 0

char   *p="abcdefg";  
    p++;  
    printf("%d",strlen(strcpy(p,"ABCD")));  
  /////////////////  
   
  p是一个常量字符串,不能改变的啊Top

11 楼xy_star(追求无限)回复于 2005-04-01 10:31:36 得分 0

首先这个程序是错误的,你能运行可能是编译器没有实现C++的部分特性。  
  char   *p="abcdefg";是定义在堆上的常量;可以改变p的值,不可以改变p指向的内容的值  
  然后strlen(strcpy(p,"ABCD")))   ==   strlen("ABCD");Top

12 楼freememe()回复于 2005-04-01 13:00:15 得分 0

程序是在TC3.0中运行的  
   
  #include   "stdio.h"  
  #include   "string.h"  
  void   main()  
  {  
    char   *p="abcdefg";  
    p++;  
    printf("%d",strlen(strcpy(p,"ABCD")));  
  }  
  答案:4  
   
  printf("%d",strlen(strcpy(p,"ABCD")));   为什么"ABCD"是覆盖"abcd"而不是覆盖"bcde"Top

13 楼freememe()回复于 2005-04-01 13:15:26 得分 0

main()  
  {  
  char   *p;  
  p="abcdefg";  
  printf("%s\n",p);  
  p++;  
  printf("%s\n",p);  
  printf("%d\n",strlen(strcpy(p,"ABCD")));  
  }  
   
  答案:  
  abcdefg  
  bcdefg  
  4  
  那么:  
  printf("%d",strlen(strcpy(p,"ABCD")));   为什么"ABCD"是覆盖"abcd"而不是覆盖"bcde"  
  Top

14 楼pijiupaopao(啤酒泡泡)回复于 2005-04-01 13:29:35 得分 0

#include   "stdio.h"  
  #include   "string.h"  
  void   main()  
  {  
    char   p[]="abcdefg";  
   
    printf("%s%d",p,strlen(strcpy(&p[1],"ABCD")));  
  }  
  //===========================================  
  aABCD  
  4  
  为什么是4,不是5呀?Top

15 楼snippet_cn()回复于 2005-04-01 13:57:08 得分 0

注意1:char   *p;char   p[]中两个p是不一样的  
   
  注意2:char   *p="abcdefg";p的值是可以变的,p指向的字符串是常量字符串,是不能改变的,新的编译器均如此  
   
  注意3:strcpy会拷贝字符串中的‘\0’Top

16 楼jinus(燃冰)回复于 2005-04-01 15:39:59 得分 0

很奇怪啊,    
  char   *p="abcdefg";  
  里面p是指向一个常量地址的,  
  strcpy(p,"ABCD")  
  是无法改变这个常量字符串的值地,所以编译虽可以通过,  
  一运行就会出现内存错误,程序崩溃.Top

17 楼jinus(燃冰)回复于 2005-04-01 15:47:51 得分 0

在tc里可以运行的话,关于:  
  printf("%d",strlen(strcpy(p,"ABCD")));   为什么"ABCD"是覆盖"abcd"而不是覆盖"bcde"  
   
  其实,"ABCD"既没有覆盖"abcd"也没有覆盖"bcde",只是p丢弃了原来指向的内存地址,  
  而重新指向新的字符串常量"ABCD"的地址了.这时候p与以前的"abcdefg"已经没有  
  任何关系了.以前的"abcdefg"虽然还在内存里放着,但是它的位置已经找不到了,  
  这就是内存泄露.  
  对不对?大侠指点一下.Top

18 楼Sisopp(书呆子)回复于 2005-04-01 16:01:19 得分 0

char*   p   =   "abcdefg";  
  常量字符串,内容不能改变。Top

19 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-04-01 17:01:26 得分 0

常量字符串不能修改内容的  
  用数组   char[]Top

20 楼wind5110(叶之落)回复于 2005-04-01 20:28:03 得分 0

C没有字符串类,我是头疼的要死。Top

21 楼xxxdg(学习中)回复于 2005-04-01 21:17:02 得分 0

回复人:   jinus(燃冰)   (   )   信誉:100     2005-04-01   15:47:00     得分:   0      
     
     
        在tc里可以运行的话,关于:  
  printf("%d",strlen(strcpy(p,"ABCD")));   为什么"ABCD"是覆盖"abcd"而不是覆盖"bcde"  
   
  其实,"ABCD"既没有覆盖"abcd"也没有覆盖"bcde",只是p丢弃了原来指向的内存地址,  
  而重新指向新的字符串常量"ABCD"的地址了.这时候p与以前的"abcdefg"已经没有  
  任何关系了.以前的"abcdefg"虽然还在内存里放着,但是它的位置已经找不到了,  
  这就是内存泄露.  
  对不对?大侠指点一下.  
       
     
  --------------------------------------------------------  
   
  NO!  
  常量不可更改,这是原则,   TC3我没试过,一会儿可以试一下;  
  你说的这种情况理论上是不存在的,  
  strcpy函数确实是拷贝数据不是拷贝地址  
  这种情况下不叫做内存泄露,   因为常量数据在程序运行完毕之后是可以归还给操作系统的.Top

22 楼du51(郁郁思扬)回复于 2005-04-02 00:35:02 得分 0

char   *p="***********"里面的***********是不可改变的.如*p="@@@@@@@@@@@"就出现错误.  
  但是p=0可以.p的值是可变的.也就是说,p可以指向这一常量,也可以不指向它.而这个常量本身不能被改变.  
  char   str[]中str是一个地址.是不可改变的.  
  strcpy是从下标0开始copy直到连'\0'也挎进来.  
  注意.strcpy拷贝前提是有一个空间存在.对一个空指针进行操作.无法通过编译的.Top

23 楼vsong(房价越来越高,所以,好男人越来越少……)回复于 2005-04-02 11:31:00 得分 0

指针没有分配空间怎么能用strcpy的?  
  能编译的过就奇怪了!Top

24 楼liubingqian(海风)回复于 2005-04-02 13:07:36 得分 0

一些古董级编译器是可以编译楼主的代码的,新的编译器编译不过。Top

25 楼crcr(游侠)回复于 2005-04-02 14:03:14 得分 0

注意1:char   *p;char   p[]中两个p是不一样的  
   
  注意2:char   *p="abcdefg";p的值是可以变的,p指向的字符串是常量字符串,是不能改变的,新的编译器均如此  
   
  注意3:strcpy会拷贝字符串中的‘\0’  
  在tc里可以运行的话,关于:  
  printf("%d",strlen(strcpy(p,"ABCD")));   为什么"ABCD"是覆盖"abcd"而不是覆盖"bcde"  
   
  其实,"ABCD"既没有覆盖"abcd"也没有覆盖"bcde",只是p丢弃了原来指向的内存地址,  
  而重新指向新的字符串常量"ABCD"的地址了.这时候p与以前的"abcdefg"已经没有  
  任何关系了.以前的"abcdefg"虽然还在内存里放着,但是它的位置已经找不到了,  
  这就是内存泄露.  
  Top

26 楼showlie(想长膘的小猪……)回复于 2005-04-02 14:37:36 得分 0

strcpy函数的原型为:char*   strcpy(char   *,char   *);  
  注意一下strcpy函数的返回类型就知道为什么strlen回返回4了。Top

27 楼xhltoo(晨风)回复于 2005-04-04 14:13:54 得分 0

关注!Top

28 楼bcboycn(雨后新竹)回复于 2005-04-05 21:49:38 得分 0

你用的是strcpy,之后p的内容就是“ABCD”了。你可以在程序的最后加一行printf("%s",p);试试。Top

相关问题

  • 指针!!!!
  • this指针
  • 指针?
  • 指针
  • 指针
  • 指针!
  • this指针
  • 指针??
  • 指针
  • 指针?

关键词

  • c++
  • 内存
  • 编译器
  • 指针
  • 拷贝
  • 函数
  • 代码
  • 编译
  • 常量
  • abcd

得分解答快速导航

  • 帖主:freememe

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo