В таких функциях, как snprintf
, strlcat
и strlcpy
, где их справочная страница упоминает size_t size
в аргументах указанных функций, что такое size
или как лучше всего получить size
?
Взято из strlcpy(3)
, strcat(3)
и printf(3)
(с добавленными комментариями)
size_t
strlcpy(char *dst, const char *src, size_t size);
// ^^^^
char *
strncat(char *str, const char *src, size_t n);
// ^
int
snprintf(char *str, size_t size, const char *format, ...);
// ^^^^
Я так понимаю, что size
можно (или, в случае strncat
, нужно?) получить так:
sizeof dst - strlen(dst) - 1
// sizeof dst buffer, minus the offset of '\0', minus 1 for the null-terminator
Но я помню, как читал где-то на SO, чтобы получить size
переменной, которую вы сделали что-то вроде:
sizeof <VAR> / <SOMETHING ELSE?>
// sorry, I don't remember the rest of this method
Есть ли разница между этими двумя формами, являются ли они эквивалентными и/или взаимозаменяемыми, или они действительны только при определенных обстоятельствах?
EDIT: я думаю, что теперь я понимаю это немного лучше. sizeof
возвращает размер в байтах того, что вы ему передаете, но в тех же случаях вам необходимо учитывать размер целевого буфера в дополнение к размеру исходного буфера, как в случае strncat
.
size_t
— это типunsigned
, способный хранить размер максимально возможного объекта. Будем надеяться, что это по крайней мереunsigned int
(нет гарантии, желательно из-за целочисленного продвижения по умолчанию), хотя с таким же успехом может быть иunsigned long long
. - person Deduplicator   schedule 24.12.2014