我有固定大小的数组 - arr1 和 arr2。
char arr1[100];
char arr2[100];
snprintf(arr2, sizeof(arr2), "%sAND", "CONTENTOFARRAY2");
snprintf(arr1, sizeof(arr1), "%sAND", arr2);
第二个snprintf会导致缓冲区溢出吗?我已经尝试了一些测试,到目前为止没有发现任何问题。
有没有人注意到任何此类问题?
在第二次调用中,"%s"
没有指示snprintf()
使用所有arr2[100]
- 请参阅注释,只是构成字符串的第一部分 - 希望这并不过分。
如果arr2[]
填充更长的字符串(例如 98 个字符(,arr1[]
将收到串联的截断版本。仍然没有缓冲区溢出。
由于snprintf()
设计为防止溢出,因此不需要检查溢出。 相反,谨慎使用 snprintf()
会检查结果是否截断。
snprintf
函数返回如果足够大n
将写入的字符数,不计算终止 null 字符,如果发生编码错误,则返回负值。C11dr §7.21.6.3 3
int count = snprintf(arr1, sizeof arr1, "%sAND", arr2);
if (count < 0 || count >= sizeof arr1) Handle_Error();