
C语言,指针问题,大家给指教啊!
intmain(intargc,constchar*argv[]){chara[]="hellohizy";charb[6];char*p1,*p2;p1=a;p2=b;...
int main(int argc, constchar * argv[])
{
char a[]="hellohizy";
char b[6];
char *p1,*p2;
p1=a;
p2=b;
for (int i=0; i<6; i++,p1++,p2++) {
*p2=*p1;
}
printf("%s",p2);
}
结果为hellohizy
b[6] 字符串b应该只有6个字节啊,为什么可以打印出9个字符???
修改为i<7时,结果为
ellohizy
这又是为什么啊? 展开
{
char a[]="hellohizy";
char b[6];
char *p1,*p2;
p1=a;
p2=b;
for (int i=0; i<6; i++,p1++,p2++) {
*p2=*p1;
}
printf("%s",p2);
}
结果为hellohizy
b[6] 字符串b应该只有6个字节啊,为什么可以打印出9个字符???
修改为i<7时,结果为
ellohizy
这又是为什么啊? 展开
7个回答
展开全部
这个程序有点意思,呵呵
其实解释起来也不难,运行完for后,那么p2刚好指向a的首地址,
在c中,程序运行时会申请一块内存,用来保存变量
申请变量时有顺序的,那么a在前,b在后,高位先存储的特点
那么在低位就存储了b的六个内存空间,高位存储了a的那10个字符(9个字符加一个结束符)
这样在程序运行完for后,p2刚好指向a的首地址,这样明白没有
最后打印p2的时候,刚好打印的是a的10个字符
如果是7,那么就覆盖一个a的数据,当然不会打印h了,从h后开始打印到结束符
其实解释起来也不难,运行完for后,那么p2刚好指向a的首地址,
在c中,程序运行时会申请一块内存,用来保存变量
申请变量时有顺序的,那么a在前,b在后,高位先存储的特点
那么在低位就存储了b的六个内存空间,高位存储了a的那10个字符(9个字符加一个结束符)
这样在程序运行完for后,p2刚好指向a的首地址,这样明白没有
最后打印p2的时候,刚好打印的是a的10个字符
如果是7,那么就覆盖一个a的数据,当然不会打印h了,从h后开始打印到结束符
展开全部
会出现乱码吧
在for循环结束后,p2指向的位置不再是b[0]的地址了
还有需要注意的是用%s输出需要有'\0'
在for循环结束后,p2指向的位置不再是b[0]的地址了
还有需要注意的是用%s输出需要有'\0'
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
很好奇你这个程序运行之后居然会打印出字符,按道理这里的p2是一直在加的,到最后p2变成了p2+6,此时打印p2,应该打印不出字符的,因为你是给p2到p2+5之间的6个字节赋值了。如果真的像你说的那样输出了hellohizy,唯一的解释就是编译器给数组b,数组a分配的内存空间恰好是连在一起的,而且数组b在前,数组a在后,也只有这样,当是i<7时,p2=p2+7了,此时就从数组a的第二个字符开始往后打印,刚好是ellohizy。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这种在c中编译的时候没有选择优化会有这样的情况发生。在函数中存放数据的结构为栈,首先a10个字符入栈,然后是b[6]6个字节,p1,p2各四个字节。p1指向a的起始位置,p2指向b的起始位置。p1自加6次之后指向的是i,而p2自加6次之后刚好指向a的起始位置,所以打印之后的值为a的结果。当为7时就是从a[1]开始的字符串。选择优化的话存放方式发生改变,出现的可能就是一串乱码。这样越界使用是很危险的行为。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
因为p2的值正好是a地址,也就是"hellohizy"的首地址,所以就打印出了hellohizy
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
此时的p2已经指向b[5]的下一个内存单元了,这样输出当然得不到正确的结果了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询