当我取消注释第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)
name_1 = "boufos"表示变量name_1现在指向包含常量字符串"boufos"的只读内存.由于这是一个只读内存,因此您的strcpy调用将失败name_1[i] = name_2[i];(或者name_1[str_length(name_2)] = '\0'如果name_2为空);
你没有给出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.