如果我已经为字符串b指定了值,则无法将字符串a复制到字符串b

Lee*_*eet 2 c pointers

当我取消注释第13行时,程序到达第25行然后退出.在复制到name_2的值之前,我给name_1赋值的可能是什么?先感谢您.

#include <stdio.h>
#include <stdlib.h>

void strcpy(char* name_1, char* name_2);

int main()
{
    char *name_1, *name_2;
    name_1 = (char*)malloc(20*sizeof(char));
    name_2 = (char*)malloc(20*sizeof(char));
    printf("Insert name asap!: ");
    gets(name_2);
    //name_1 = "boufos";
    printf("The first name is: %s and the second: %s\n", name_1, name_2);
    strcpy(name_1, name_2);
    printf("The first name is: %s and the second: %s\n", name_1, name_2);
    return 0;
}

void strcpy(char* name_1, char* name_2)
{
    int i = 0;
    while (name_2[i] != '\0')
    {
        name_1[i] = name_2[i];
        i++;
    }
    name_1[str_length(name_2)] = '\0';

}

int str_length(char* name_2)
{
    int i = 0;
    while (name_2[i] != '\0')
    {
        i++;
    }
    return i;
}
Run Code Online (Sandbox Code Playgroud)

Neo*_*ard 6

name_1 = "boufos"表示变量name_1现在指向包含常量字符串"boufos"的只读内存.由于这是一个只读内存,因此您的strcpy调用将失败name_1[i] = name_2[i];(或者name_1[str_length(name_2)] = '\0'如果name_2为空);


dbu*_*ush 5

你没有给出name_1价值,至少不是你想象的那样.

当你这样做:

name_1 = (char*)malloc(20*sizeof(char));
Run Code Online (Sandbox Code Playgroud)

name_1指向动态分配的内存区域.但如果你这样做:

name_1 = "boufos";
Run Code Online (Sandbox Code Playgroud)

现在name_1指向字符串常量"boufos",覆盖malloc内存的地址并导致内存泄漏.C中的字符串常量通常也位于内存的只读区域,因此当您尝试写入时,程序会崩溃.

你需要调用strcpy(真正的,而不是你的实现)来复制字符串.这提出了另一点:不要创建与系统或库函数同名的函数.给它一些其他名称my_strcpy.