请看如下代码: #include<stdio.h> void copy_string(char a[],char b[]) { int i=0; for(i=0;a[i]!='\0';
汗,如下式代码:
#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);
} 展开
楼上说的有道理。我认为是这样的:
因为这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开始。不清楚为什么有这样的差别。
b[]的空间不足以存储a[], copy的时候,多出的部分溢出后篡改了a[]的内容.
2010-11-17