Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 理解strdup函数_C_Pointers - Fatal编程技术网

C 理解strdup函数

C 理解strdup函数,c,pointers,C,Pointers,我试图构建我自己的strdup函数,因为我知道该函数应该作为strcpy工作,但使用的字符串可以在另一个函数中使用,但在我的原型中,我不明白为什么我的字符没有被复制 我制作了这个原型,但我不明白为什么我的函数返回的指针不显示我的字符串 char *my_strdup(char *str) { char *new_str; char *to_copy; int i; to_copy = str; i

我试图构建我自己的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);
}

返回的指针指向字符串的结尾,而不是字符串的开头

您需要返回
malloc
给您的指针。这就是您在
new\u str
首次分配给
new\u 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++;
char *mystrdup(const char *str)
{
    size_t len = strlen(str);
    char *result = malloc(len + 1);
    memcpy(result, str, len + 1);
    return result;
}
您可以使用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;
}
请注意,在所有情况下,我从
malloc
返回的值都是未经修改的


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

我必须用一个新的_str回到起点-?引入两个指针变量要干净得多。一个指向字符串,一个指向要指定给的字符。或者使用数组索引。我现在的答案有三种不同的方法。但是,在它们中,我从来没有修改过存储由
malloc
返回的字符串指针的变量。这样做会导致痛苦。