我正在处理这个问题: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));
这假设dest
和src
是表示数组变量的表达式,如下所示。
char a[3];
char b[4] = {'a', 'b', 'c', ' '};
strncpy_s(a, sizeof(a), b, sizeof(b));
相反,如果dest
或src
是指针(例如,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位(。如果您有一个指针,则需要在第二个变量中跟踪分配的大小。