【问题标题】:Trying to copy a char* to another char*试图将一个 char* 复制到另一个 char*
【发布时间】:2018-04-15 14:57:41
【问题描述】:

我的代码有问题

char* strdup(const char* s)
{
    int n = 0;

    for(; *s != 0; s++)
    {
        n++;
    }

    char* p = new char[n+1];

    for(int i = 0; i < n; i++)
    {
        p[i] = s[i];
    }
    p[n] = 0;

    return p;
}

int main()
{
    const char* p = "testing";

    char* p_copy = strdup(p);

    std::cout << p << '\n' << p_copy << std::endl;

    return 0;
}

没有按预期工作。

我想编写一个函数,它接收 const char* 并将其复制到新分配的 char 内存中。完成后,它应该返回一个指向字符的指针。

现在当我尝试它时,我的输出很简单:

testing

提前感谢您的帮助

【问题讨论】:

  • 你为什么不使用strcpymemcpy之类的功能。
  • char*a 复制到char*b 很简单:b = a。这里的代码试图复制指针指向的 data。这种区别并非微不足道。忽视它总是会带来麻烦。

标签: c++ string memory char allocation


【解决方案1】:

在开始将s 复制到p 之前,尽量不要增加它。我注意到,在您的第一个 for 循环中,您递增 s 直到它指向空值,然后使用该指针值开始您的字符串复制。难怪你得到一个空字符串。

【讨论】:

  • 天哪,谢谢!我完全忘记了增量为我的s 分配了一个新值,现在这很有意义!
【解决方案2】:

这里:

for(; *s != 0; s++)

你增加s。所以它不再指向输入字符串的开头。它指向字符串的空终止符。那么,这里:

for(int i = 0; i < n; i++)
{
    p[i] = s[i];

您尝试从 null 终止符开始复制 n 字符,但最终会读取到具有未定义行为的数组末尾。

解决方案:复制s 以计算字符数:

const char* s2 = s;
for(; *s2 != 0; s2++)

更好的是,您可以将长度计数部分重构为一个名为 strlen 的可重用函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多