DreamNext、初墨 发表于 2020-2-4 10:52:29

字符指针求解

在学习字符指针中,编写代码时发现一个搞不懂的问题
代码编译无误,运行正常,但是结果在某一处就发现错误。
编译环境是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 11:45:46

本帖最后由 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:35:37

本帖最后由 响指是个小菜鸡 于 2020-2-4 13:41 编辑

改成:
char arr_1[]="Li Sansui\0";
char arr_2[]="Xu Yiner\0";
就OK了,就是在后面分别加上\0。

WFR 发表于 2020-2-4 21:10:29

应该是前一个的长度小于第二个字符数组的长度吧
页: [1]
查看完整版本: 字符指针求解