Segfault仅在打印时

时间:2012-01-17 21:51:25

标签: c segmentation-fault printf

我有一个看起来像这样的循环

while(condition){
  read_some_data(source, buf, BUFSIZE);
  printf(buf);
  memset(buf, 0, BUFSIZE+1);
  //do stuff to affect condition that does not touch buf
}

buf是一个大小为BUFSIZE+1的char数组。奇怪的是,如果我注释掉printf,程序将完美执行而不会出现分段错误。只有当我尝试打印buf时才会出现问题。此外,seg故障不一定发生在循环的第一次迭代中。它通常需要6或7次迭代。

此外,此程序中没有动态内存分配。

5 个答案:

答案 0 :(得分:7)

  • 确保buf在分配范围内的某处有一个空(零值)字节。该空字节是printf可以告诉它到达字符串末尾的方式;没有它,它会继续阅读它可以安全的地方。
  • 确保buf不包含%d printf可能用于指示其他参数的任何内容。更好 - 只需使用printf("%s", buf),这可以完全消除任何此类风险。

答案 1 :(得分:6)

您缺少printf的格式说明符参数

答案 2 :(得分:1)

确保buf\0终止字符串。 只有这时printf()才能打印字符串。

答案 3 :(得分:1)

您需要将字符串指定为打印参数:printf("%s", buf);

希望这有帮助!
N.S。

答案 4 :(得分:0)

是否以空值终止?如果你想做的就是把buf写到stdout,你为什么要调用printf(buf)而不是puts(buf)?