在C中复制字符串(包括内存分配、指针等)
这是我目前掌握的代码:在C中复制字符串(包括内存分配、指针等),c,string,memory,duplicates,C,String,Memory,Duplicates,这是我目前掌握的代码: char * duplicate(char *str) { int len = strlen(str) + 1; char *ptr; ptr = (char *)malloc(len); strcpy(ptr, str); str = (char *)realloc((void *)str, len * 2 * sizeof(char)); strcat(str, ptr); free((void *)ptr);
char * duplicate(char *str)
{
int len = strlen(str) + 1;
char *ptr;
ptr = (char *)malloc(len);
strcpy(ptr, str);
str = (char *)realloc((void *)str, len * 2 * sizeof(char));
strcat(str, ptr);
free((void *)ptr);
present(str);
return(str);
}
旁注:我知道我应该检查内存是否已实际分配,稍后我会检查
程序要求用户输入一个字符串,然后将其加倍并打印出新字符串。
present->我创建的一个
函数,它可以打印出字符串
现在我的思考过程如下:
1) 将内存分配给占位符指针,将str
字符串复制到ptr
2) 为str
重新分配内存,现在的大小是原来的两倍
3) 使用strcat
复制字符串
4) 释放ptr
内存
输出应如下所示:
string input by users for example: "Hi"
output: "HiHi"
如果我们再次运行该函数,输出应该是:“hihihi”
我面临的问题是,在运行函数大约2-4次(取决于输入字符串大小)后,程序将崩溃,它会说它有一个触发点和一些类似的内容:“wntdll.pdb not loaded”。
我相信它与内存有关,因为如果我试图复制更大的字符串,它将在第一次之后崩溃
我是否正确分配内存?我不知道现在该怎么办
感谢您的帮助:)您只需使用以下工具即可避免所有的样板文件: 你的职能是:
char* duplicate(char const *str) {
char *ptr = strdup(str);
ptr = (char*) realloc(ptr, 2 * strlen(str) + 1);
strcat(ptr, str);
return ptr;
}
您不需要额外的分配:
char * duplicate(char *str)
{
size_t len = strlen(str);
char *ret = realloc(str, 2*len+1); //assuming no overflow
if(ret){
memcpy(ret+len, ret, len);
ret[2*len]=0;
}
return ret;
}
.谢谢,它确实把事情弄清楚了!你知道我的另一个问题吗?因为字符串被复制,但是如果太长就会崩溃。@Dimakossover多长时间?如果输入字符串是“hi”,它会复制它两次,因此它变成hi->hihi->HIHIHI->hihihihi->此时,它会崩溃。(再次调用复制函数后。)做一个有根据的猜测,我认为在您的版本中返回输入字符串是不合理的。您看,您实际上正在更改输入缓冲区。您好@101010我实际上忘记了将新值从代码传递到ptr_s main,现在我已经完成了,一切都很好,没有崩溃,非常顺利,感谢您的关注和帮助,非常感谢!谢谢,这是非常有益的!我的问题是,memcpy做什么?(显然,它复制内存块)但是如果不使用此函数,我如何重新创建?提前谢谢。在使用您的代码后,同样的情况也会发生,我可以复制一个字符串几次,并且在第三次到第五次程序崩溃之后。@Dimakossover向我们展示整个代码。也许你做了一些非法的事情,比如重复(foo)代码>或
char*foo=“foo”;复制(foo)代码>。(你知道为什么这是非法的,对吧?)嗨@DavidSchwartz我在这里复制了相关的代码:,提前谢谢。@Dimakossover因为你有太多的代码会弄乱ptr\u s
,这个错误可能在任何地方。我先看一下get
。(或者给我们足够的代码来重现问题。)
char * duplicate(char *str)
{
size_t len = strlen(str);
char *ret = realloc(str, 2*len+1); //assuming no overflow
if(ret){
memcpy(ret+len, ret, len);
ret[2*len]=0;
}
return ret;
}