检查缓冲区大小/ strncpy

时间:2016-11-07 10:42:35

标签: c pointers buffer strncpy

我确定已经问了很多这个问题,但是我会问btw因为我还没有找到答案。

我必须重新创建strncpy函数(我不需要/想要任何解决方案)并且我无法重现此函数的确切行为。

这是我的代码:

int main(void)

{

   char dest1[15];

   char dest2[15];

   char *src = "abcdefgh";

   size_t n = 16;

   putstr(strncpy(dest1, src, n);
// the output is : [1]    23975 abort      ./a.out

   putstr(ft_strncpy(dest2, src, n);
// the output is : abcde[1]    23975 abort      ./a.out

   return (0);

}

我认为函数strncpy检查dest1缓冲区的大小,并在返回之前将其与n进行比较。

函数ft_strncpy是我的函数,strncpy的副本。

如何检查函数中缓冲区dest2的大小?它没有使用dest2 ++(无限循环)或dest2 [index](返回0);

编辑:删除了dest1和dest2的星星。并添加了对什么是ft_strncpy的解释。

2 个答案:

答案 0 :(得分:3)

至于你的问题。您无法检查目的地的大小。你只拥有一个指针,仅此而已。您必须依赖源字符串或长度小于目标指针指向的内存。

另外请记住,您不能依赖目的地的内容。其内容可能未初始化,因此不确定。数组或内存通常没有终结符。字符串终止符是约定,而不是由语言强制执行的内容。

答案 1 :(得分:1)

首先要说的是,dest1dest2是类型char *的数组,wen作为参数传递给函数,衰减到数组中第一个元素的地址。 / p>

现在,问题在于,第一个元素是未初始化(wild)指针,任何访问该指针指向的内存的尝试都会调用undefined behavior

在取消引用(使用)它们之前,您需要确保使数组元素指向有效的内存。

那就是说,

  

如何检查函数

中缓冲区dest2的大小

嗯,你不是。根据要求,strncpy()不会这样做。此外,你不能单独使用指针,你需要自己跟踪分配的内存大小,它不能直接从指针中删除。