当我取消注释第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;
}
答案 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
。