版权声明:转载请声明 https://blog.csdn.net/qq_40732350/article/details/82924171
#include <stdio.h>
int
main(void)
{
char a[] = "123456789";
char b[] = "123";
printf("&a = [%ld] , &b = [%ld]\n", a, b);
strcpy(b, a);
printf("&a = [%ld] , &b = [%ld]\n", a, b);
printf("a = [%s] , b = [%s] \n", a, b);
}
解析:以上程序输出结果是123456789,56789.
没经验的程序员一定会在此大跌眼镜的,源字串竟然被截掉了一部分。
原因:
是当初分配的内存地址是连续内存的问题,原来是 1234\0123456789\0 , strcpy后变成了123456789\06789\0 ) ,
教训:
在分配空间的时候要给源字符串和目标字符串留足够的空间。
把目标字串定义在前,源字串定义在后,虽然可以看到正确的输出结果, 123456789 , 123456789,但会产生一个运行期错误,原因估计是越过了目标字串的实际空间,访问到了不可预知的地址。
微软在这里是写得非常简单的,代码如下:
但是在Linux上可以正常运行
Linux源代码: