复制指针然后返回第一个指针的用途是什么

时间:2012-08-31 15:49:51

标签: c pointers

关于以下功能我有3个问题。我在代码中将它们标记为注释。

  1. 为什么我们将destmalloc ed memory)指向的char项复制到dPtr,然后最后(处理输入字符串后){{1 }}。在return dest上进行操作不会更简单。

  2. 此功能只有在内部有破折号时才会反转该字。标记的命令dest是否将*subword = '\0';字符放在先前增加的位置(NUL) - strncpysubword+1

  3. 此功能是否容易出现缓冲区溢出或其他不良行为?现在它没有给我任何错误,但我想我只是不知道如何调试它。


  4. subwordlen

    strlen(word)

3 个答案:

答案 0 :(得分:1)

  

为什么我们将dest(malloced内存)指向的char项复制到dPtr,然后在最后(处理输入字符串后)返回dest。在dest上操作会不会更简单。

因为在函数结束时,dPtr不会指向dest字符串的开头,所以如果指针本身是dest,我们就不会返回整个我们建造的desination字符串。

答案 1 :(得分:1)

  1. 如果直接修改dest,则函数返回的值将不相同。所以你需要传递一个临时指针。
  2. \0字符放在*subword的位置(而不是-字符)。

答案 2 :(得分:1)

  1. dPtr用于遍历字符串并对其进行修改。 dest被保留为该修改后的字符串的开头,最终是函数的返回值。在每次循环迭代结束时,dPtr将指向修改后的字符串的末尾,并用于每个连续的strncpy。最终,该函数返回一个修改后的字符串,并且需要dest来跟踪它的开始。

  2. 大概是
  3. subword被终止,因此只有subword中的字符才会被复制到循环中strncpy的结果中,但实际上这不是必需的使用strncpy。该函数向后移动通过字符串寻找破折号。对于每次点击,subword是下一个划线划分的子字符串。子字符串是内部内存的一段内存,它不是以空字符结尾的。如果您使用的是strcpy,那么您需要subword的空终止,但由于您使用的是strncpy,因此无需使用空终结符:只需要小心n值为strncpy限制。此代码空终止subword 到位,即在原始字符串参数中粘贴空字符。这导致#3:

  4. 对于不受欢迎的行为,该函数通过修改原始字符串参数来完成它的工作 - 它将subword的那些空终止符放入源字符串中 - 即使它保留了自己的修改后的缓冲区和返回字符串。

  5. 最后,使用dPtr操作而不是strncat,代码可以不使用strncpy