2012-01-17 52 views
1

时,我有一个循环,看起来像这样段错误只打印

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时,我才发现问题。此外,seg故障不一定发生在循环的第一次迭代中。它通常需要6或7次迭代。

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

+3

如果正确使用printf(),会发生什么?即'printf(“%s”,buf);' – 2012-01-17 21:54:10

+0

@DanFego我很尴尬。那是我的问题。 – Daniel 2012-01-17 21:55:53

+2

只要你学到了东西,就不用尴尬!也就是说,如何使用'printf()'或者使用'-Wall'并注意编译器警告。 :) – 2012-01-17 21:58:10

回答

7
  • 确保buf具有空(零值)分配的范围内的某处字节。该空字节是printf可以告诉它已到达字符串的末尾;没有它,它会继续阅读它可以安全地进行的地方。
  • 确保buf不包含%d之类的东西,printf可能用于指示其他参数。更好的是—只是使用printf("%s", buf),它完全消除了这种风险。
6

你缺少格式说明论点的printf

1

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

1

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

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

0

它是否以null结尾?你为什么要调用printf(buf)而不是put(buf)如果你只想把buf写出到stdout?