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