在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;
}