我可以使用malloc模拟strcpy吗?

我可以使用malloc模拟strcpy吗?,c,c-strings,C,C Strings,我试图从头开始为一个类创建strcpy函数。虽然我可以使用for循环并复制单个字符,但我认为我可以使用malloc和指针进行交换,以提高效率。这是我的代码,但我已经得到了很多令人困惑的错误 void notStrcpy(char s1[], char s2[]) { //copies string s1 into s2 char *s3 = (char *) malloc(strlen(s1)); //s3 is now an alias of s1 s2 = *s3;} //dereferen

我试图从头开始为一个类创建strcpy函数。虽然我可以使用for循环并复制单个字符,但我认为我可以使用malloc和指针进行交换,以提高效率。这是我的代码,但我已经得到了很多令人困惑的错误

void notStrcpy(char s1[], char s2[]) { //copies string s1 into s2
char *s3 = (char *) malloc(strlen(s1)); //s3 is now an alias of s1
s2 = *s3;} //dereference s3 to dump s1 into s2

为什么会发生这种情况?有没有办法让代码按照我的预期工作?

你不能这样做:
strcpy
希望两个内存块都准备好了—一个用于读取字符串,另一个用于写入字符串。这两个地址都应有足够的内存来容纳以null结尾的C字符串的实际内容

另一方面,
malloc
为您提供了第三块内存(您需要分配
strlen+1
,但情况完全不同)。字符串复制算法对该内存块没有任何用处。最重要的是,分配函数的参数对传递到函数中的值没有影响,因此
s2=*s3
没有做您认为应该做的事情

长话短说,
while((*s1++=*s2++)
是最简单的strcpy实现


注意:
malloc
在实现字符串复制功能时很有用,例如
strdup
。如果您决定尝试一下,请不要忘记为空终止符分配空间。

@dasblinkenlight谢谢。我的新代码如下:

void totallyNotstrcpy(char s1[], char s2[]) {
int x = 0;
while (x < strlen(s1)+1) {
    s2[x] = s1[x];
    x++;
}
}
void totalynotstrcpy(字符s1[],字符s2[]{
int x=0;
而(x

作为一个简短的附带问题,您的代码段是如何工作的?while循环不需要条件吗?

不,绝对不是这样。不能使用赋值运算符复制字符串。这就是strcpy的全部要点。如果赋值运算符支持字符串复制,则无需使用strcpy
strcpy
?从我们这边想象一下,因为我们甚至看不到让你困惑的错误,因为你选择不在你的问题中分享它们。不管怎样,你所尝试的似乎是徒劳的,更多关于C中指针如何使用的研究应该放在你研究的议程上。如果你不想循环,你可以使用
memcpy
。但循环可能是最好的。使用
memcpy
您将需要字符串的长度,因此添加对
strlen
的调用,那么您保存了什么?@Johnny Mopp:他已经调用了
strlen
。他只需保存值并使用两次:用于
malloc
strcpy
。谢谢。我的新函数如下:void totalynotstrcpy(char s1[],char s2[]){void totalynotstrcpy(char s1[],char s2[]){太糟糕了。
strlen()
是O(n),所以你的
strcpy
是O(n^2)。你不需要知道字符串的长度。你只需要复制字符,直到你达到(并且已经复制)为止NUL终止符,即O(n)。