----------------解决方案--------------------------------------------------------
你先把ch3的空间先分配了再试试
----------------解决方案--------------------------------------------------------
ch3[10]空间分配不足,第一个for循环p3自增5次,第二个for循环p3又自增10次,而数组一个就10个空间, p3指到数组外了!!而外边的空间正好是j的空间!!
通过下边程序可以验证:
#include"stdio.h"
void main()
{
char ch1[5] = {'H','e','l','l','o'},ch2[5]={'W','o','r','l','d'};
int i,j;
char ch3[10],*p1,*p2,*p3;
printf("&j=%d\n",&j); //打印j的地址
printf("ch3=%d\n",ch3); //打印数组ch3的首地址
p1=ch1;
p2=ch2;
p3=ch3;
for(i=0;i<5;i++)
{
*p3=*(p1+i);
p3++;
}
for(j=0;j<10;j++)
{
*p3=*(p2+j);
p3++;
printf("%c",ch3[j]);
}
printf("\nj=%d\n",j);//注意此处的j 并不等于10
printf("\n");
}
在我机器上的运行结果为:
&j=1245032
ch3=1245020
HelloWo
j=205
可以看出p3自增12次以后,就指向j了,而程序中p3自增了15次!
----------------解决方案--------------------------------------------------------
....为什么偶在GCC下都是一样的结果呢?
----------------解决方案--------------------------------------------------------
我的是VC6.0
----------------解决方案--------------------------------------------------------
我初学,说错了勿怪!
是不是for中的变量j应该从5开始循环?
----------------解决方案--------------------------------------------------------
结果确实是不一样的。
正如ww84020209同学所说,*p2和*p3指针都指向了不是程序员所设想的位置,LZ犯了写C程序的大忌。
我分析产生上述错误的原因:*p2和*p3指针都经过了初始化,并且在循环里都是按等差递增的,所以指向的位置是可以预期的。
刚好指到了程序编译时存储变量的位置,但是具体是什么变量又不一定(由ch3后面定义的变量而定),所以会产生上述问题,既在交换定义变量的顺序时,可能运气很好,指针越界刚好指到了空,运行结果就会正确;也可能运气不好,刚好指到的位置有值,就会打出乱码。
下面是我修改的代码:(红色位置作了修改,请参考)
#include <stdio.h>
void main()
{
char ch1[5] = { 'H' , 'e' , 'l' , 'l' , 'o' },
ch2[5] = { 'W' , 'o' , 'r' , 'l' , 'd' },
ch3[10];
char *p1 = ch1,
*p2 = ch2,
*p3 = ch3;
int i,j;
/*
p1 = ch1;
p2 = ch2;
p3 = ch3;
*/
for ( i=0 ; i<5 ; i++ )
{
*p3 = *( p1 + i );
p3++;
}
for ( j=0 ; j<10 ; j++ )
{
if ( j < 5 )
{
*p3 = *( p2 + j );
p3++;
}
printf ( "%c" , ch3[j] );
}
printf ( "\n" );
}
综上所述,再用C语言写代码时,请慎用指针!!!
----------------解决方案--------------------------------------------------------