使用destsz=sizeof(dst)作为strncpy_s()是否有缺点



我正在处理这个问题:https://en.cppreference.com/w/c/string/byte/strncpy

功能标题描述如下:

errno_t strncpy_s(char *restrict dest, rsize_t destsz, const char *restrict src, rsize_t count);

除了速度之外,设置destsz = sizeof(dest)还有什么显著的缺点吗?

如果要像这个一样使用strncpy_s

strncpy_s(dest, sizeof(dest), src, sizeof(src));

这假设destsrc是表示数组变量的表达式,如下所示。

char a[3];
char b[4] = {'a', 'b', 'c', ''};
strncpy_s(a, sizeof(a), b, sizeof(b));

相反,如果destsrc是指针(例如,char*(,就像这样。

char* ptr1 = a;
char* ptr2 = b;
strncpy_s(ptr1, sizeof(ptr1), ptr2, sizeof(ptr2));

代码会编译,但值会错误,因为sizeof(ptr1)是指针对象的大小,而不是数组的大小。在这种情况下,您必须以其他方式提供的大小

因此,没有直接的缺点,但使用这种模式可能容易出错。

正如@Alex所建议的,在使用Microsoft C Runtime Library时,您可以直接传递目标的数组表达式,而无需单独传递的大小

strncpy_s(a, ptr2, sizeof(b));

然后,提供大小是不必要的,这样做除了可能混淆数组和指针之外什么都不会带来。例如,如果意外地写入strncpy_s(ptr1, b, sizeof(b)),代码将不会编译,而不是使用错误的值

否,事实上,当您提供一个固定宽度的数组作为目标参数时,strncpy_s的模板重载正是这样做的。然而,如果dest是指针类型,则sizeof(dest)将不起作用,因为指针的大小总是本地机器字的大小(32或64位(。如果您有一个指针,则需要在第二个变量中跟踪分配的大小。

相关内容

  • 没有找到相关文章

最新更新