请看如下代码: #include<stdio.h> void copy_string(char a[],char b[]) { int i=0; for(i=0;a[i]!='\0';

运行结果为什么第二次输出a的内容是变了纳?请高手们回答。或上机操作一下。汗,如下式代码:#include<stdio.h>voidcopy_string(chara[],... 运行结果为什么第二次输出a的内容是变了纳?请高手们回答。或上机操作一下。
汗,如下式代码:
#include<stdio.h>
void copy_string(char a[],char b[])
{
int i=0;
for(i=0;a[i]!='\0';i++)
b[i]=a[i];
b[i]='\0';
}
void main()
{
char a[]="123456789a123456789b1234";
char b[]="1234567";
printf("string a=%s\nstring b=%s\n",a,b);
printf("copy string a to string b:\n");
copy_string(a,b);
printf("\n\n\nstring a=%s\nstring b=%s\n",a,b);
}
展开
 我来答
百度网友5f85683f5
2010-11-17 · TA获得超过1660个赞
知道小有建树答主
回答量:581
采纳率:0%
帮助的人:837万
展开全部

楼上说的有道理。我认为是这样的:

因为这2个数组都不是动态分配的,应该在栈上分配的,根据栈的性质,a, b应该是在一块连续的区域,这样分配完a,b后,相应内存的数据应该是:

12345678\0(这之前是b的)123456789a123456789b1234\0(这之前是a的)

因为你的copy函数是以a字符串结束为标志,那么对b来说它有9个字节长,那么依次放入a的前9个字符这是毫无鸭梨的,那么,之后再往里放a剩下的字符怎么办,已经越界了,编译器不作检查,仍然向后访问,注意此时i=8,即b[8],实际上这是不存在的,但b和a连续,所以b[8]相当于a[0]的位置,这样a剩下的内容 9123456789b1234从a[0]开始放到a[14],然后a[15]放\0,这样a就被截断了,

输出字符串是以左边数起的第1个\0结束,那么b就变成了

123456789123456789b1234(后面有个\0把a里原来的第2个6吃掉)

a就从原来的第2个'7'开始

即 789b1234

我认为是这样的。下面是我在vs2005里的运行结果,你可以看到,运行后虽然有结果,但报错,说变量a附近的栈被破坏,你的结果a是从9开始的,我想了半天不知道为什么,但我作mingw确实得到了你那个结果,vs2005是从7开始。不清楚为什么有这样的差别。

jdq_37
2010-11-17 · TA获得超过996个赞
知道小有建树答主
回答量:658
采纳率:0%
帮助的人:956万
展开全部
程序出现溢出。
b[]的空间不足以存储a[], copy的时候,多出的部分溢出后篡改了a[]的内容.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
dullyyg
2010-11-18
知道答主
回答量:18
采纳率:0%
帮助的人:0
展开全部

上两张图,答案很明显了吧 ,由于不能上两张图,所以,我说下,在单步运行时候b地址是ff5c    a地址是ff64,地下那个图就可以说明了 ,为什么不把分给我?

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
志向不改信念不衰
2010-11-17 · TA获得超过123个赞
知道答主
回答量:31
采纳率:0%
帮助的人:33.2万
展开全部
嗯,溢出了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jinlaimai
2010-11-17
知道答主
回答量:1
采纳率:0%
帮助的人:0
展开全部
s
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2010-11-17
展开全部
ssfs
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 3条折叠回答
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式