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

2025-06-25 19:04:19
推荐回答(6个)
回答1:

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

因为这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开始。不清楚为什么有这样的差别。

回答2:

程序出现溢出。
b[]的空间不足以存储a[], copy的时候,多出的部分溢出后篡改了a[]的内容.

回答3:

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

回答4:

嗯,溢出了

回答5:

s

回答6:

ssfs