我确定已经问了很多这个问题,但是我会问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的解释。
答案 0 :(得分:3)
至于你的问题。您无法检查目的地的大小。你只拥有一个指针,仅此而已。您必须依赖源字符串或长度小于目标指针指向的内存。
另外请记住,您不能依赖目的地的内容。其内容可能未初始化,因此不确定。数组或内存通常没有终结符。字符串终止符是约定,而不是由语言强制执行的内容。
答案 1 :(得分:1)
首先要说的是,dest1
和dest2
是类型char *
的数组,wen作为参数传递给函数,衰减到数组中第一个元素的地址。 / p>
现在,问题在于,第一个元素是未初始化(wild)指针,任何访问该指针指向的内存的尝试都会调用undefined behavior。
在取消引用(使用)它们之前,您需要确保使数组元素指向有效的内存。
那就是说,
如何检查函数
中缓冲区dest2的大小
嗯,你不是。根据要求,strncpy()
不会这样做。此外,你不能单独使用指针,你需要自己跟踪分配的内存大小,它不能直接从指针中删除。