当前位置: 代码迷 >> C语言 >> 关于字符指针的一个疑问
  详细解决方案

关于字符指针的一个疑问

热度:218   发布时间:2008-04-26 22:06:12.0
关于字符指针的一个疑问
#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  疑问  字符  

----------------解决方案--------------------------------------------------------
我的WIN-TC编译后,出现的结果与你的不同。
----------------解决方案--------------------------------------------------------
char a[]="my name is fa min";
     char b[]="I am a student";
问题在这...这两个数组是开辟连续的内存,而且内存是靠在一起的..a[]比b[]先进栈..当用a来修改b时..如果b比a短..顺着内存,就把a的内容给修改了..结果就出现了只有一个n了..可以自己尝试下
----------------解决方案--------------------------------------------------------
#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[]数组被修改了
----------------解决方案--------------------------------------------------------
可能是指针越界访问出现的问题。
----------------解决方案--------------------------------------------------------
最好明白程序执行时怎么样开辟内存的..这样好多问题就比较清楚了....
----------------解决方案--------------------------------------------------------
只需要指定后一个数组的长度不小于前一个数组的长度即可。如char b[17]="I am a student"就可以输出正确结果了

[[it] 本帖最后由 Sun_DN 于 2008-4-26 23:59 编辑 [/it]]
----------------解决方案--------------------------------------------------------
回复 3# 的帖子
我不太懂具体是怎么改到a的您能不能具体说一下,我同学说如果用C++做也会出现同样的问题,粗略的知道是越界的原因,但我这么也想不通怎么一个数组变成了一个字符了
----------------解决方案--------------------------------------------------------
你可以调试下..两个数组字符的位置...单步调试...至于出现'n'是因为你的最后一个'\0'引起的....
----------------解决方案--------------------------------------------------------
观察内存分配:若不指定各个数组的长度,a起始于40,b起始于30,即b的地址比a低。
复制过程中,b的长度会覆盖到a的起始地址上,正好a[0]是b的最后一个元素,a[1]即b的结束符,所以输出a时只得n。
若指定b的长度大于或等于a的长度,就不会发生上面的情况。
----------------解决方案--------------------------------------------------------
  相关解决方案