鱼C论坛

 找回密码
 立即注册
查看: 1139|回复: 3

[已解决]字符指针求解

[复制链接]
发表于 2020-2-4 10:52:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在学习字符指针中,编写代码时发现一个搞不懂的问题
代码编译无误,运行正常,但是结果在某一处就发现错误。
编译环境是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;
}
最佳答案
2020-2-4 11:45:46
本帖最后由 jackz007 于 2020-2-4 14:01 编辑
  1.     char arr_1[]="Li Sansui";
  2.     char arr_2[]="Xu Yiner";
  3. . . . . . .
  4.     Copy(arr_1,arr_2);
复制代码

        根本问题出在 arr_1[] 的长度比 arr_2[] 长,这两个字符串在内存中占据相邻存储空间,arr_2[] 在前,arr_1[] 在后。把 arr_1[] 复制到 arr_2[] 会突破 arr_2[] 的存储空间,侵占到属于 arr_1[] 的存储空间。

  1. 复制前:
  2. 'X' , 'u' , ' ' , 'Y' , 'i' , 'n' , 'e' , 'r' , '\0' | 'L' , 'i' , ' ' , 'S' , 'a' , 'n' , 's' , 'u' , 'i' , '\0'
  3. 复制后:
  4. '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' 开头,所以,就成了空串了。
        如果为两个字符串分配充裕的存储空间,效果就完全不同了:
  1. #include<stdio.h>

  2. void Copy(char * p_from , char * p_to)
  3. {
  4.     for(; * p_from != '\0' ; p_from ++ , p_to ++) * p_to = * p_from ;
  5.     * p_to = '\0'                                                   ;
  6. }

  7. int main(void)
  8. {
  9.     char arr_1[16] = "Li Sansui"   ;
  10.     char arr_2[16] = "Xu Yiner"    ;
  11.     printf("arr_1:%s\n" , arr_1)   ;
  12.     printf("arr_2:%s\n" , arr_2)   ;
  13.     printf("开始复制\n")           ;
  14.     Copy(arr_1 , arr_2)            ;
  15.     printf("arr_1 : %s\n" , arr_1) ;
  16.     printf("arr_2 : %s\n" , arr_2) ;
  17. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-4 11:45:46 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2020-2-4 14:01 编辑
  1.     char arr_1[]="Li Sansui";
  2.     char arr_2[]="Xu Yiner";
  3. . . . . . .
  4.     Copy(arr_1,arr_2);
复制代码

        根本问题出在 arr_1[] 的长度比 arr_2[] 长,这两个字符串在内存中占据相邻存储空间,arr_2[] 在前,arr_1[] 在后。把 arr_1[] 复制到 arr_2[] 会突破 arr_2[] 的存储空间,侵占到属于 arr_1[] 的存储空间。

  1. 复制前:
  2. 'X' , 'u' , ' ' , 'Y' , 'i' , 'n' , 'e' , 'r' , '\0' | 'L' , 'i' , ' ' , 'S' , 'a' , 'n' , 's' , 'u' , 'i' , '\0'
  3. 复制后:
  4. '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' 开头,所以,就成了空串了。
        如果为两个字符串分配充裕的存储空间,效果就完全不同了:
  1. #include<stdio.h>

  2. void Copy(char * p_from , char * p_to)
  3. {
  4.     for(; * p_from != '\0' ; p_from ++ , p_to ++) * p_to = * p_from ;
  5.     * p_to = '\0'                                                   ;
  6. }

  7. int main(void)
  8. {
  9.     char arr_1[16] = "Li Sansui"   ;
  10.     char arr_2[16] = "Xu Yiner"    ;
  11.     printf("arr_1:%s\n" , arr_1)   ;
  12.     printf("arr_2:%s\n" , arr_2)   ;
  13.     printf("开始复制\n")           ;
  14.     Copy(arr_1 , arr_2)            ;
  15.     printf("arr_1 : %s\n" , arr_1) ;
  16.     printf("arr_2 : %s\n" , arr_2) ;
  17. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-4 13:35:37 | 显示全部楼层
本帖最后由 响指是个小菜鸡 于 2020-2-4 13:41 编辑

改成:
char arr_1[]="Li Sansui\0";
char arr_2[]="Xu Yiner\0";
就OK了,就是在后面分别加上\0。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-4 21:10:29 | 显示全部楼层
应该是前一个的长度小于第二个字符数组的长度吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-15 00:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表