本帖最后由 jackz007 于 2020-2-4 14:01 编辑 char arr_1[]="Li Sansui";
char arr_2[]="Xu Yiner";
. . . . . .
Copy(arr_1,arr_2);
根本问题出在 arr_1[] 的长度比 arr_2[] 长,这两个字符串在内存中占据相邻存储空间,arr_2[] 在前,arr_1[] 在后。把 arr_1[] 复制到 arr_2[] 会突破 arr_2[] 的存储空间,侵占到属于 arr_1[] 的存储空间。
复制前:
'X' , 'u' , ' ' , 'Y' , 'i' , 'n' , 'e' , 'r' , '\0' | 'L' , 'i' , ' ' , 'S' , 'a' , 'n' , 's' , 'u' , 'i' , '\0'
复制后:
'L' , 'i' , ' ' , 'S' , 'a' , 'n' , 's' , 'u' , 'i' | '\0' , 'i' , ' ' , 'S' , 'a' , 'n' , 's' , 'u' , 'i' , '\0'
"|" 是两个字符串的空间分界
复制前,arr_1[0] 和 arr_2[0] 分别是 'L' 和 'X',复制后,arr_1[0] 和 arr_2[0] 分别是 '\0' 和 'L' ,所以,arr_2[] 可以正常显示,而 arr_1[] 由于以 '\0' 开头,所以,就成了空串了。
如果为两个字符串分配充裕的存储空间,效果就完全不同了:#include<stdio.h>
void Copy(char * p_from , char * p_to)
{
for(; * p_from != '\0' ; p_from ++ , p_to ++) * p_to = * p_from ;
* p_to = '\0' ;
}
int main(void)
{
char arr_1[16] = "Li Sansui" ;
char arr_2[16] = "Xu Yiner" ;
printf("arr_1:%s\n" , arr_1) ;
printf("arr_2:%s\n" , arr_2) ;
printf("开始复制\n") ;
Copy(arr_1 , arr_2) ;
printf("arr_1 : %s\n" , arr_1) ;
printf("arr_2 : %s\n" , arr_2) ;
}
|