windows未指定字符数组大小的BUG

版权声明:转载请声明 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源代码:

猜你喜欢

转载自blog.csdn.net/qq_40732350/article/details/82924171