【问题标题】:Understanding the strdup function了解 strdup 函数
【发布时间】:2013-09-18 12:57:24
【问题描述】:

我尝试构建自己的 strdup 函数,因为我知道该函数应该像 strcpy 一样工作,但使用的字符串可以在另一个函数中使用,但在我的原型中,我不明白为什么我的字符没有被复制。

我已经做了这个原型,但是我不明白为什么我的函数返回的指针不显示我的字符串

char            *my_strdup(char *str)
{
  char          *new_str;
  char          *to_copy;
  int           i;

  to_copy = str;
  i = strlen(str + 1);
  new_str = malloc(sizeof(*new_str) * i + 1);
  while(i - 1 > 0)
    {
      *new_str = *to_copy;
      new_str++;
      to_copy++;
      i--;
    }
  return(new_str);
}

这是我的测试功能:

int             main()
{
  char          *str;

  str = my_strdup("helloo");
  printf("%s\n", str);
}

【问题讨论】:

    标签: c pointers


    【解决方案1】:

    您正在返回一个指向字符串结尾的指针,而不是字符串的开头。

    你需要返回malloc给你的指针。这就是您在最初分配给new_str 时放入new_str 的内容。但是不是返回那个,而是修改那个指针然后返回它。

    您的代码还有很多其他问题。例如此时:

    i = strlen(str + 1);
    

    您计算从str[1] 开始的字符串的长度。如果您的字符串长度为零,这将导致未定义的行为。

    也许你打算写:

    i = strlen(str) + 1;
    

    在这种情况下,您对malloc 的调用将分配过多。

    使用sizeof(*new_str) 毫无意义,因为它保证等于1

    无论如何,与其尝试修正您的代码,这里有一些可能的替代方案。

    char *mystrdup(const char *str)
    {
        char *result = malloc(strlen(str) + 1);
        char *psrc = str;
        char *pdst = result;
        while (*psrc != 0)
        {
            *pdst = *psrc;
            pdst++;
            psrc++;
        }
        *pdst = '\0';
        return result;
    }
    

    你可以像这样使循环体更简洁:

    *pdst++ = *psrc++;
    

    你可以用 for 循环来做到这一点:

    char *mystrdup(const char *str)
    {
        size_t len = strlen(str);
        char *result = malloc(len + 1);
        for (size_t i = 0; i <= len; i++)
            result[i] = str[i];
        return result;
    }
    

    或者你甚至可以像这样使用memcpy

    char *mystrdup(const char *str)
    {
        size_t len = strlen(str);
        char *result = malloc(len + 1);
        memcpy(result, str, len + 1);
        return result;
    }
    

    请注意,在所有情况下,我从 malloc 返回的值都未经修改返回。

    我忽略了调用 malloc 时可能出现的错误情况。你可以放心!

    【讨论】:

    • 我必须回到开头一个 new_str-- ?
    • 好吧,引入两个指针变量会更简洁。一个指向字符串,一个指向要分配的字符。或者使用数组索引。我的答案现在有三种不同的方法。但是在它们中,我都没有修改过存储malloc返回的字符串指针的变量。这样做会导致痛苦。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多