1.分析下面代码有什么问题?
1
2
3
4
5
6
|
void test1() { char string[10]; char * str1 = "0123456789" ; strcpy ( string, str1 ); } |
字符串str1需要11个字节才能存放下(包括末尾的’ ’),而string只有10个字节的空间,strcpy会导致数组越界;
2.分析下面代码有什么问题?
1 void test2() 2 { 3 char string[10], str1[10]; 4 int i; 5 for(i=0; i<10; i++) 6 { 7 str1 = 'a'; 8 } 9 strcpy( string, str1 ); 10 }
首先,代码根本不能通过编译。因为数组名str1为 char *const类型的右值类型,根本不能赋值。
再者,即使想对数组的第一个元素赋值,也要使用 *str1 = 'a';
其次,对字符数组赋值后,使用库函数strcpy进行拷贝操作,strcpy会从源地址一直往后拷贝,直到遇到' '为止。所以拷贝的长度是不定的。如果一直没有遇到' '导致越界访问非法内存,程序就崩了。
完美修改方案为:
1 void test2() 2 { 3 char string[10], str1[10]; 4 int i; 5 for(i=0; i<9; i++) 6 { 7 str1[i] = 'a'; 8 } 9 str1[9] = '