Есть ли недостатки в использовании destsz = sizeof (dst) для strncpy_s ()? - PullRequest
0 голосов
/ 31 марта 2020

Я работаю над этим: 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)?

Ответы [ 2 ]

2 голосов
/ 31 марта 2020

Если бы вы использовали 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)), код не будет компилироваться, вместо того, чтобы работать с неправильными значениями

1 голос
/ 31 марта 2020

Нет, на самом деле перегрузки шаблона для strncpy_s делают именно это, когда вы задаете массив фиксированной ширины в качестве параметра назначения. Однако sizeof(dest) не будет работать, если dest является типом указателя, поскольку размер указателя всегда равен размеру собственного машинного слова (32 или 64 бита). Если у вас есть указатель, вам нужно будет отслеживать выделенный размер во второй переменной.

...