Если бы вы использовали strncpy_s
вот так
strncpy_s(dest, sizeof(dest), src, sizeof(src));
Это предполагает, что dest
и src
являются выражениями, представляющими переменную массива, например:
char a[3];
char b[4] = {'a', 'b', 'c', '\0'};
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))
, код не будет компилироваться, вместо того, чтобы работать с неправильными значениями