我自己尝试制作strcpy
。它应该可以工作,我甚至复制并粘贴了一些关于strcpy
的某人的(几乎是确切的代码)。两者都给我一个“分段错误”。
char* strcpy(char * destination, const char * source)
{
while( (*destination++ = *source++) != '\0' )
;
return destination;
}
这段代码有什么问题?
char* a = "hello";
cout << strcpy(a, "Haha") << endl;
答案 0 :(得分:6)
您正在尝试覆盖字符串文字。这会导致未定义的行为。将a
声明为数组:
char a[] = "hello";
您的strcpy
实现也存在错误(假设语法正常)。它应该返回一个指向目标缓冲区的开头的指针,而不是结尾。
答案 1 :(得分:4)
您正试图写入数据段,因为"hello"
存储在那里。
因此,当您致电strcpy
时,您会收到细分错误。
尝试:
char a[] = "hello";
cout << strcpy(a, "Haha") << endl;
代替。
编辑:在strcpy
函数内,复制后,destination
将指向字符串的结尾,您需要返回字符串的开头。
答案 2 :(得分:3)
a
是指向字符串文字的指针:
char* a = "hello";
尝试修改字符串文字是未定义的行为。正如Carl建议的那样,如果使用字符串文字初始化数组,它将起作用:
char a[] = "hello" ;
答案 3 :(得分:3)
除了上面和下面提到的关于字符串文字的所有内容之外,你还会返回一个指向字符串的 END 的指针,所以即使你避免了分段错误,你也会打印“”。