我可以使用 malloc 模拟 strcpy 吗?
Can I emulate strcpy using malloc?
我正在尝试从头开始为 class 创建一个 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
期望两个内存块都准备就绪 - 一个用于读取字符串,另一个用于写入字符串。两个地址都应该有足够的内存来存储以空字符结尾的 C 字符串的实际内容。
另一方面,malloc
给你第三块内存(你需要分配 strlen(s)+1
,但那是完全不同的故事)。字符串复制算法对该内存块没有用处。最重要的是,为函数分配参数对传递给函数的值没有影响,因此 s2 = *s3
没有按照您认为应该做的去做。
长话短说,while ((*s1++ = *s2++));
是最简单的 strcpy
实现。
注意: malloc
可以在字符串 duplication 函数的实现中派上用场,例如strdup
。如果您决定尝试一下,请不要忘记为空终止符分配 space。
@dasblinkenlight 谢谢。我的新代码如下:
void totallyNotstrcpy(char s1[], char s2[]) {
int x = 0;
while (x < strlen(s1)+1) {
s2[x] = s1[x];
x++;
}
}
作为一个简短的附带问题,您的代码片段是如何工作的? while循环不需要条件吗?
我正在尝试从头开始为 class 创建一个 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
期望两个内存块都准备就绪 - 一个用于读取字符串,另一个用于写入字符串。两个地址都应该有足够的内存来存储以空字符结尾的 C 字符串的实际内容。
另一方面,malloc
给你第三块内存(你需要分配 strlen(s)+1
,但那是完全不同的故事)。字符串复制算法对该内存块没有用处。最重要的是,为函数分配参数对传递给函数的值没有影响,因此 s2 = *s3
没有按照您认为应该做的去做。
长话短说,while ((*s1++ = *s2++));
是最简单的 strcpy
实现。
注意: malloc
可以在字符串 duplication 函数的实现中派上用场,例如strdup
。如果您决定尝试一下,请不要忘记为空终止符分配 space。
@dasblinkenlight 谢谢。我的新代码如下:
void totallyNotstrcpy(char s1[], char s2[]) {
int x = 0;
while (x < strlen(s1)+1) {
s2[x] = s1[x];
x++;
}
}
作为一个简短的附带问题,您的代码片段是如何工作的? while循环不需要条件吗?