【问题标题】:Segfault only when printing仅在打印时出现段错误
【发布时间】:2012-01-17 21:51:24
【问题描述】:

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

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 的字符数组。奇怪的是,如果我把printf 注释掉,程序就可以完美执行,没有分段错误。只有当我尝试打印出buf 时,我才会遇到问题。此外,段错误不一定发生在循环的第一次迭代中。通常需要 6 或 7 次迭代。

另外,这个程序没有动态内存分配。

【问题讨论】:

  • 正确使用printf()会发生什么?即printf("%s", buf);
  • @DanFego 我很尴尬。那是我的问题。
  • 只要你学到了东西就不用尴尬!也就是如何使用printf() 或许使用-Wall 并注意编译器警告。 :)
  • 过去 20 年左右有什么变化吗?我以为printf("abc");会和printf("%s","abc");有同样的效果,恐怕这只是暂时隐藏了堆的问题
  • @stacker:想想如果buf 包含任何% 字符会发生什么

标签: c segmentation-fault printf


【解决方案1】:
  • 确保buf 在分配范围内的某处有一个空(零值)字节。那个空字节是printf 如何判断它已到达字符串的末尾;没有它,它会继续阅读它可以安全完成的地方。
  • 确保buf 不包含%d 之类的任何printf 可能用来指示其他参数的内容。更好的是 - 只需使用 printf("%s", buf),它就完全消除了任何此类风险。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        希望这会有所帮助!
        N.S.

        【讨论】:

          【解决方案5】:

          它是空终止的吗?如果您只想将 buf 写入标准输出,为什么还要调用 printf(buf) 而不是 puts(buf)?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-05-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多