2012-01-17 74 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?