关于字符指针的一个疑问
#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的多就不会出现这样的情况
----------------解决方案--------------------------------------------------------
我的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的长度,就不会发生上面的情况。
----------------解决方案--------------------------------------------------------