緩衝輸出與記憶體分配(C語言陷阱)

2021-10-24 21:17:46 字數 784 閱讀 7170

程式處理方式有兩種,一種是即使處理,另一種是暫時存期再大塊寫入的方式,前者往往造成比較大的系統負擔,因此c語言往往允許程式猿進行實際的寫操作之前控制生產的資料量;

這種控制一般由庫函式setbuf()來實現,如果buf是個大小合適的陣列,則:

setbuf

(stdout

,buf)

;

語句將通知輸入/輸出庫,所有寫入到stdout的輸出都應該用buf作為輸出緩衝區,直到buf緩衝區被填滿或者程式猿呼叫ffiush,緩衝區的buf記憶體才會實際寫道stout輸出流中,快取區的大小由標頭檔案中的bufsize定義

#include

intmain()

但是此函式是錯誤的,由於setbuf的呼叫,輸入/出的所有字元應該先快取在buf中,但最後一次清空實在main函式結束之後,這就導致buf還沒清空,裡面的字元就已經被釋放了;

解決這個問題的方法有兩個:

第一種方法就是將緩衝陣列定義為靜態陣列:

static

char buf[bufsize]

;

第二種方法就是將buf宣告完全以動到main之外,這就是動態分配快取區,動態分配的快取區是不會被程式主動釋放的,所以需要程式猿在使用後主動釋放:

char

*malloc()

;setbuf

(stdout

,malloc[bufsize]

);

《C陷阱與缺陷》 緩衝輸出和記憶體分配

程式輸出有兩種方式 一種是即時處理方式,另一種是先暫存起來,然後再大塊寫入的方式,前者往往造成較高的系統負擔。因此,c語言實現通常都允許程式設計師進行實際的寫操作之前控制產生的輸出資料量。這種控制能力一般是通過庫函式 setbuf 實現的。如果 buf 是乙個大小適當的字元陣列,那麼 setbuf ...

緩衝輸出與記憶體分配

程式輸出有兩種方式 一種是即時處理方式,另一種是先暫時存起來,然後再大塊寫入的方 式,前者往往造成較高的系統負擔。因此,c語言實現通常都允許程式設計師進行實際的寫操作 之前控制產生的輸出資料量。setbuf stdout,buf 此語句通知輸入輸出庫,所有寫入到 stdout 的輸出都應該使用 bu...

緩衝輸出和記憶體分配

程式輸出有兩種方式 一種是即時處理方式,另一種是先暫存起來,然後再大塊寫入的方式,前者往往造成較高的系統負擔。因此,c語言實現通常都允許程式設計師進行實際的寫操作之前控制產生的輸出資料量。這種控制能力一般是通過庫函式setbuf實現的。如果buf是乙個大小適當的字元陣列,那麼 setbuf stdo...