当出现数组越界时,由于无法得知被访问空间存储的内容及功能,所以会出现不可预知后果。可能程序崩溃,可能运算结果非预期,也可能完全没有影响。
1.1. 代码
void test_03_03(){
char str1[10];
char str2[] = "0123456789";
strcpy(str1,str2);
printf("sizeof(str1)=%d\n",sizeof(str1));
printf("sizeof(str2)=%d\n",sizeof(str2));
}
1.2. 执行结果
1.3. 分析
试题1字符串str2需要11个字节才能存放下(包括末尾的’\0’),而str1只有10个字节的空间,strcpy会导致数组越界;
2.1 代码
void test_03_04(){
int i;
char str1[10],str2[10];
for(i=0;i<10;i++){
str2[i]='a';
}
strcpy(str1,str2);
printf("strlen(str1)=%d\n",strlen(str1));
printf("strlen(str2)=%d\n",strlen(str2));
}
2.2 执行结果
2.3 分析
a.str2数组内不能结束字符串,因为数组最后一位str2[10]='a',而不是等于‘/0’
b.strcpy(string, str1)调用使得从str1内存起复制到string内存起所复制的字节数具有不确定性,因为strcpy 拷贝到 字符‘/0’的位置
3.1 代码
void test3(char* str1)
{
char string[10];
if( strlen( str1 ) <= 10 )
{
strcpy( string, str1 );
}
}
3.2 分析
if(strlen(str1) <= 10)应改为if(strlen(str1) < 10),因为strlen的结果未统计’\0’所占用的1个字节。