size_t像snprintf这样的函数混淆了

时间:2014-12-24 00:30:27

标签: c printf sizeof size-t

snprintfstrlcatstrlcpy等函数中,其联机帮助页在所述函数的参数中提及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

但是我记得在某个地方阅读,以获得你做过类似的变量的size

sizeof <VAR> / <SOMETHING ELSE?>
// sorry, I don't remember the rest of this method

这两种形式之间是否存在差异,它们是等同的和/或可互换的,还是仅在某些情况下有效?

修改: 我想我现在明白了一点。 sizeof返回传递给它的任何内容的大小(以字节为单位),但在相同情况下,您需要将目标缓冲区的大小另外考虑到源缓冲区的大小,与strncat的情况一样。

1 个答案:

答案 0 :(得分:5)

对于strlcpy,您可以给它缓冲区的大小。如果缓冲区的大小为100,则strlcpy最多可以复制99个字符加零字节。

对于strlcat,您可以为其指定缓冲区的大小。 strlcat计算出已经有多少字节。

strlcpy,strlcat,snprintf的全部意义在于,你给它大小的缓冲区,函数计算出其余的,而不是你计算可用的字节数。那是因为计算大小的人会犯错误,所以调用strlcpy并计算自己可用的字节数就会失败。