| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 815 人关注过本帖, 1 人收藏
标题:关于字符指针的一个疑问
只看楼主 加入收藏
faminxmu
Rank: 3Rank: 3
来 自:厦门
等 级:论坛游侠
帖 子:191
专家分:106
注 册:2008-4-23
结帖率:70%
收藏(1)
 问题点数:0 回复次数:9 
关于字符指针的一个疑问
#include<stdio.h>
void main()
{
     char a[]="my name is fa min";
     char b[]="I am a student";
     printf("%s\n%s\n",a,b);
     void copy(char from[],char to[]);
     copy(a,b);
     printf("%s\n%s\n",a,b);
     system("pause");
     }
     void copy(char from[],char to[])
     {
          char *p1,*p2;
          p1=from,p2=to;
          for(;*p1!='\0';p1++,p2++)
          *p2=*p1;
         *p2='\0';
          } 研究一下,为什么第二次输出a只输出一个字母n,char b[]="I am a student";如果把这个的字符加多一点如比a的多就不会出现这样的情况
搜索更多相关主题的帖子: 指针 char 疑问 字符 
2008-04-26 22:06
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
我的WIN-TC编译后,出现的结果与你的不同。
2008-04-26 22:18
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
char a[]="my name is fa min";
     char b[]="I am a student";
问题在这...这两个数组是开辟连续的内存,而且内存是靠在一起的..a[]比b[]先进栈..当用a来修改b时..如果b比a短..顺着内存,就把a的内容给修改了..结果就出现了只有一个n了..可以自己尝试下

学习需要安静。。海盗要重新来过。。
2008-04-26 22:56
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
#include<stdio.h>
void main()
{
     char a[]="my name is fa min";
     char d[]="i miss you ";
     char b[]="I am a student";
     printf("%s\n%s\n",a,b);
     void copy(char from[],char to[]);
     copy(a,b);
     printf("%s\n%s\n",a,b);
     //system("pause");
     }
     void copy(char from[],char to[])
     {
          char *p1,*p2;
          p1=from,p2=to;
          for(;*p1!='\0';p1++,p2++)
          *p2=*p1;
         *p2='\0';
    }
这样就没有问题了...但是d[]数组被修改了

学习需要安静。。海盗要重新来过。。
2008-04-26 22:59
交流者
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2007-9-5
收藏
得分:0 
可能是指针越界访问出现的问题。
2008-04-26 23:06
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
最好明白程序执行时怎么样开辟内存的..这样好多问题就比较清楚了....

学习需要安静。。海盗要重新来过。。
2008-04-26 23:08
Sun_DN
Rank: 1
来 自:NEU
等 级:新手上路
帖 子:48
专家分:0
注 册:2006-4-5
收藏
得分:0 
只需要指定后一个数组的长度不小于前一个数组的长度即可。如char b[17]="I am a student"就可以输出正确结果了

[[it] 本帖最后由 Sun_DN 于 2008-4-26 23:59 编辑 [/it]]

人不己知,而不愠,不亦君子乎?
2008-04-26 23:44
faminxmu
Rank: 3Rank: 3
来 自:厦门
等 级:论坛游侠
帖 子:191
专家分:106
注 册:2008-4-23
收藏
得分:0 
回复 3# 的帖子
我不太懂具体是怎么改到a的您能不能具体说一下,我同学说如果用C++做也会出现同样的问题,粗略的知道是越界的原因,但我这么也想不通怎么一个数组变成了一个字符了

在虚拟的世界中寻找目标。
2008-04-27 00:27
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
你可以调试下..两个数组字符的位置...单步调试...至于出现'n'是因为你的最后一个'\0'引起的....

学习需要安静。。海盗要重新来过。。
2008-04-27 11:29
Sun_DN
Rank: 1
来 自:NEU
等 级:新手上路
帖 子:48
专家分:0
注 册:2006-4-5
收藏
得分:0 
观察内存分配:若不指定各个数组的长度,a起始于40,b起始于30,即b的地址比a低。
复制过程中,b的长度会覆盖到a的起始地址上,正好a[0]是b的最后一个元素,a[1]即b的结束符,所以输出a时只得n。
若指定b的长度大于或等于a的长度,就不会发生上面的情况。

人不己知,而不愠,不亦君子乎?
2008-04-27 18:05
快速回复:关于字符指针的一个疑问
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.042230 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved