| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1250 人关注过本帖
标题:[求助]问一个问题
只看楼主 加入收藏
honkerman
Rank: 2
等 级:新手上路
威 望:4
帖 子:3078
专家分:0
注 册:2006-8-25
收藏
得分:0 
5楼的兄弟测试错了,你那样没有颠倒顺序丫,还是先声明char后声明int,

" target="_blank">God Bless You[GLOW=255,#00ff00,2]My Friends![/GLOW]
2006-09-04 23:08
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 

你先把ch3的空间先分配了再试试

2006-09-04 23:11
ww84020209
Rank: 1
等 级:新手上路
帖 子:190
专家分:0
注 册:2006-8-21
收藏
得分:0 
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次!

2006-09-04 23:58
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
收藏
得分:0 
....为什么偶在GCC下都是一样的结果呢?

淘宝杜琨
2006-09-05 14:34
ww84020209
Rank: 1
等 级:新手上路
帖 子:190
专家分:0
注 册:2006-8-21
收藏
得分:0 

我的是VC6.0


2006-09-05 15:02
violet2006
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2006-9-5
收藏
得分:0 
我初学,说错了勿怪!
是不是for中的变量j应该从5开始循环?
2006-09-05 15:22
aladdin
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2006-9-5
收藏
得分:0 

结果确实是不一样的。
正如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语言写代码时,请慎用指针!!!

2006-09-05 17:03
快速回复:[求助]问一个问题
数据加载中...
 
   



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

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