字符指针求解
在学习字符指针中,编写代码时发现一个搞不懂的问题代码编译无误,运行正常,但是结果在某一处就发现错误。
编译环境是Mac的Xcode
已经用红色字体标明哪一句结果错误
具体为
能够显示arr_1:
但是没有输出arr_1的具体内容
代码如下:
//字符指针复制数组
#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()
{
char arr_1[]="Li Sansui";
char arr_2[]="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);
return 0;
}
本帖最后由 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 和 arr_2 分别是 'L' 和 'X',复制后,arr_1 和 arr_2 分别是 '\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 = "Li Sansui" ;
char arr_2 = "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) ;
} 本帖最后由 响指是个小菜鸡 于 2020-2-4 13:41 编辑
改成:
char arr_1[]="Li Sansui\0";
char arr_2[]="Xu Yiner\0";
就OK了,就是在后面分别加上\0。 应该是前一个的长度小于第二个字符数组的长度吧
页:
[1]