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

时间:2018-08-16 20:03:09

标签: 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;
}

2 个答案:

答案 0 :(得分:6)

name_1 = "boufos"意味着变量name_1现在指向保存常量字符串“ boufos”的只读存储器。由于这是只读存储器,因此您的strcpy调用将在name_1[i] = name_2[i];处失败(如果name_1[str_length(name_2)] = '\0'为空,则将name_2失败)。

答案 1 :(得分:5)

您没有给name_1一个值,至少不是您认为的那样。

执行此操作时:

name_1 = (char*)malloc(20*sizeof(char));

您使name_1指向动态分配的内存区域。但是,如果这样做,那么:

name_1 = "boufos";

现在name_1指向字符串常量"boufos",覆盖了已分配内存的地址,并导致内存泄漏。 C中的字符串常量通常也位于内存的只读区域,因此当您尝试对其进行写入时,程序将崩溃。

您需要调用strcpy(实际的,不是您的实现)来复制字符串。这就提出了另一点:不要创建与系统或库函数同名的函数。给它起一个其他名称,例如my_strcpy