c - 在C中复制字符串(包括内存分配、指针等)

标签 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);
    present(str);
    return(str);
}

旁注:我知道我应该检查内存是否实际分配,我稍后会这样做。

程序要求用户输入一个字符串,将其加倍并打印出新字符串。 我制作的 present->a 函数,以便它将打印出字符串。

现在我的思考过程如下:

1) 分配内存给占位符指针,将str字符串复制到ptr

2) 为 str 重新分配内存,现在大小加倍

3) 使用strcat复制字符串

4) 释放ptr内存

输出应如下:

string input by users for example: "Hi"

output: "HiHi"

如果我们再次运行该函数,输出应为:"HiHiHiHi"

我面临的问题是,运行该函数大约 2-4 次(取决于输入字符串大小)后,程序将崩溃,它会说它有一个触发点和类似以下内容的内容: “wntdll.pdb未加载”。

我相信这与内存有关,因为如果我尝试复制较大的字符串,它会在第一次后崩溃。

我分配内存正确吗?我现在不知道该怎么办。

感谢您的帮助:)

最佳答案

您不需要额外的分配:

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

关于c - 在C中复制字符串(包括内存分配、指针等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41728908/

相关文章:

linux - 更改 docker 容器的 swappiness

c - 解决结构数组及其中的 realloc 的一些建议

c - 声明为常量和 volatile 的指针

java - LeetCode正则表达式问题中重叠子问题的可视化以及DP的使用

php - PHP中的startsWith()和endsWith()函数

c++ - 将内存 "belonging"的意外使用调试到父函数

c - 指针直接分配给字符串?有什么缺点?

c - 初始化一个指向二维数组的指针,然后将其与另一个数组链接

c - 错误: No matching asm pattern exists

java - 将句子转换为数组并删除字符并打印新句子