void test1()
{
int i;
char string[10];
char *str1="0123456789";
strcpy(string, str1); // 字符越界?
/*
错误:
strcpy(desc,src),
当src<=desc时, 如 char *str1="012345678",长度为10,
则string得到合理值,并且string[9]='/0';
当src>desc时,如 char *str1="0123456789",长度为11,
则string得到0-9的值,string[9]='9',
虽然可以运行,但string[9]后面的一个不属于string的字符
被恶意修改为‘/0',这不是我们想要的,也可能造成严重后果。
*/
printf("%s/n",string);
for(i=0;i<11;i ++)//故意循环11次,查看最后一个被无意修改的字节;
{
printf("%c/t%d/n",string[i],string[i]);
}
printf("/n");
}
void test2()
{
int i;
char string[100], str1[10];
for(i=0; i<10;i++)
{
str1[i] ='a';
}
strcpy(string, str1);
/*
strcpy(desc,src)
会把src 视为string类型,拷贝时查找'/0'结束符,作为scr的结束,来付给desc;
所以,本程序虽然能够运行,但潜在的问题:
str1的所有10个元素被初始化为'a',但后续的字符是不可预料的,
直到”偶然“碰到了'/0',才停止识别str1;
如果string是个100个元素的大数组,则会发现str1后面的"随机元素"也被复制给了string
直到碰到'/0'
说"偶然",加引号,其实'/0'在未知内存中还是挺多的。呵呵
当然,如果desc是string[10]的话,也就会掐掉str1后面的东东,这就是表面上的运行正确;
*/
printf("%s/n",string);
for(i=0;i<100;i++)
{
printf("%c/t%d/t%c/n",string[i],string[i],str1[i]); //对比来看;
}
printf("/n");
}
{
int i;
char string[10];
char *str1="0123456789";
strcpy(string, str1); // 字符越界?
/*
错误:
strcpy(desc,src),
当src<=desc时, 如 char *str1="012345678",长度为10,
则string得到合理值,并且string[9]='/0';
当src>desc时,如 char *str1="0123456789",长度为11,
则string得到0-9的值,string[9]='9',
虽然可以运行,但string[9]后面的一个不属于string的字符
被恶意修改为‘/0',这不是我们想要的,也可能造成严重后果。
*/
printf("%s/n",string);
for(i=0;i<11;i ++)//故意循环11次,查看最后一个被无意修改的字节;
{
printf("%c/t%d/n",string[i],string[i]);
}
printf("/n");
}
void test2()
{
int i;
char string[100], str1[10];
for(i=0; i<10;i++)
{
str1[i] ='a';
}
strcpy(string, str1);
/*
strcpy(desc,src)
会把src 视为string类型,拷贝时查找'/0'结束符,作为scr的结束,来付给desc;
所以,本程序虽然能够运行,但潜在的问题:
str1的所有10个元素被初始化为'a',但后续的字符是不可预料的,
直到”偶然“碰到了'/0',才停止识别str1;
如果string是个100个元素的大数组,则会发现str1后面的"随机元素"也被复制给了string
直到碰到'/0'
说"偶然",加引号,其实'/0'在未知内存中还是挺多的。呵呵
当然,如果desc是string[10]的话,也就会掐掉str1后面的东东,这就是表面上的运行正确;
*/
printf("%s/n",string);
for(i=0;i<100;i++)
{
printf("%c/t%d/t%c/n",string[i],string[i],str1[i]); //对比来看;
}
printf("/n");
}