Tim*_*per 3 c memory string printf strlen
一个评论我的一个答案给我留下了有点摸不着头脑.当试图计算将两个字符串连接到一个新的内存块需要多少内存时,据说使用的snprintf是首选strlen,如下所示:
size_t length = snprintf(0, 0, "%s%s", str1, str2);
// preferred over:
size_t length = strlen(str1) + strlen(str2);
Run Code Online (Sandbox Code Playgroud)
我可以在这背后得到一些推理吗?有什么优势,如果有的话,有人会看到一个结果与另一个结果不同吗?
我是那个说出来的人,而且我+1在评论中遗漏了快速而粗心的内容,所以让我解释一下.我的观点仅仅是你应该使用相同方法的模式来计算最终将用于填充字符串的长度,而不是使用两种可能在细微方面存在差异的不同方法.
例如,如果你有三个字符串而不是两个字符串,并且它们中的两个或多个重叠,则有可能strlen(str1)+strlen(str2)+strlen(str3)+1超过SIZE_MAX并包裹过零,导致输出分配不足和截断(如果snprintf使用)或极其危险的内存腐败(如果strcpy和strcat使用).
snprintf将返回-1与errno=EOVERFLOW时得到的字符串会比长INT_MAX,所以你的保护.您确实需要在使用它之前检查返回值,并为null终止符添加一个.