【发布时间】:2019-09-15 06:33:12
【问题描述】:
我在尝试实现自定义 strcpy 函数时遇到了麻烦,该函数应该处理 src 字符串大于目标字符串的情况。在这里,我提供了一些代码,以便你们可以看到整个功能。我的问题是,每次我增加 *dest 时,它都会进入一个空地址,尽管我已经分配了足够的内存来容纳其中的所有 src。这会导致(双指针)dest = *src 中的分段错误。 dest 存储为 char** 因为实际上,必须传递的参数是另一个可能比 src 更小的字符串,我希望尽可能安全地覆盖 *dest。
int customStrCpy(char** dest, char* src){
int strlen1 = strlen(*dest), strlen2 = strlen(src);
if(strlen1 < strlen2){
//Creates a dynamically allocated array that is big enough to store the contents of line2.
*dest = calloc(strlen2, sizeof(char));
char* backup_str = *dest;
int copy_arrs;
for(copy_arrs = 0; copy_arrs < strlen2; copy_arrs++){
**dest = *src;
*dest++; src++;
}
*dest = backup_str;
}
else strcpy(*dest, src);
}
最后,(char**)dest 应该指向正确的字符串。
【问题讨论】:
-
strlen返回的结果比您想要的少。注意终止\0。还有 -dest在传递给这个函数时总是指向一个有效的字符串吗? -
strlen(*dest)只会告诉您 *dest 中的当前字符数。如果它是在调用您的方法之前分配的,那么如果不将该长度传递给您的方法,您就无法知道分配了多少空间。 -
你确实意识到这个功能,即使你修复了它,基本上也是一个内存泄漏工厂?
-
如果用新分配的字符串替换目标字符串,还应该释放原始分配。
-
为什么不在
calloc()之后使用strcpy()?另外,如果要立即覆盖它,为什么要使用calloc()而不是malloc()?