如何防止char指针缓冲区溢出?

时间:2010-05-11 00:52:43

标签: c arrays pointers reference

即。 -

int function(char* txt)
{
   sprintf(txt, "select * from %s;", table);
   //How do I set last char in buffer to NULL here?
}

所以如果表格中的文字有500个字符长,而主要的txt只定义为100 ....

感谢。

3 个答案:

答案 0 :(得分:11)

你需要

  • 在函数中添加一个给出缓冲区大小的参数
  • 使用snprintf()代替sprintf()
  • 检查snprintf()的返回值,以查看保存所有格式化数据所需的缓冲区大小;如果这大于或等于缓冲区的大小,你应该按照你认为合适的方式处理(缓冲区仍然是空终止的,但内容将被截断以适应;这是否正常或错误完全取决于在你的用例上)

(你的函数需要一个返回类型......)

答案 1 :(得分:3)

您应该能够使用snprintf来限制使用的缓冲区数量。

function(char* txt, size_t length)
{
   int rv;
   rv = snprintf(txt, length, "select * from %s;", table);
   //How do I set last char in buffer to NULL here?
   if (rv >= length) {
       // error
   }
}

答案 2 :(得分:0)

关于你唯一能做的就是malloc足够的内存,将字符串格式化到那个内存中,并返回一个指向它的指针。然后,调用函数将负责在完成内存时释放内存。