oh,原來是printf的錯

2021-05-22 01:05:26 字數 1032 閱讀 1316

我們都知道,函式體內部定義的區域性變數,在函式體結束之後就被自動釋放了。但是看看下面的程式,或許你會大吃一驚。

#include

int *p;

int* func()

int main(void)

其執行結果為:

104198548

4198570

是不是覺得第乙個輸出很詭異啊?變數明明已經釋放了,卻還是列印出了變數的值。更不可思意的是,只有第乙個printf列印出了正確的值,其後的printf都輸出髒資料。

接著我們再來看一下下面這個函式,或許你會知道問題出在哪了。

#include

int *p;

int* func()

int main(void)

執行結果是:

abdc

1245056

4198561

4198583

現在,3個printf都列印的是髒資料,或許,問題出在printf上。是不是存在乙個輸出緩衝區,而每次呼叫printf,都會重新整理緩衝區呢?

為了驗證我們的想法,我們對程式又做了如下的更改

#include

int *p;

int* func()

int main(void)

現在程式的執行結果為:  

1245056

4198561

4198583

3個printf都輸出了髒資料,這樣便驗證了我們的想法。

原來,在linux標準庫函式中,有一類函式被稱為「高階i/o函式」,我們熟知的printf()、fwriter()等函式,都屬於此類,他們也被稱為「緩衝i/o」。每次寫檔案的時候,先寫入緩衝區中,等滿足一定的條件後,再一次性寫入到檔案中,從而提高程式的效率。看到這,是不是會感到疑惑,printf()明明是輸出函式,為什麼上面說「再一次性』寫入』到檔案中」?這個問題,你能理解stdin、stdio這些流其實也是檔案的話,那麼你也就能夠理解上面的話了。

下面那位仁兄說的十分正確,我理解有誤,非常感謝。

HTML,原來是它們

在學習完牛腩新聞發布系統之後,才發現自己每天瀏覽的網頁是怎麼來的。原來,看起來很高大上的網頁自己也可以做得有模有樣。接下來的學習,應該就是具體知識細節的學習了。html的知識很簡單,也很基礎。html,超文字標記語言,標準通用標記語言下的乙個應用。web網頁也是一種文件,html就是用於編寫這種文件...

for迴圈原來是這樣

for迴圈可以說是程式中最靈活,最常用,最重要的乙個迴圈用法,大家經常用到,但是你真正理解for迴圈的執行原理嗎?舉個例子 for i 0 i 8 i 對於這個語句執行結束的時候 i 是多少?經常用,卻沒怎麼注意,執行結束的時候 i 是8 下面說一下for迴圈語句的執行過程 for 表示式1 表示式...

大學原來是這麼美好

人的一生會失去很多東西,有的追逐一生也得不到,有的短暫的擁有卻最終失去!我們一生都在為這些得到與得不到而苦腦 徘徊。我的大學時光也就這樣在揮揮噁噁的荒度了!記得大二時曾看過一部 大學我被你上了 記得當時在圖書館偶然看到這本書的時候,還以為是講一段美妙的大學愛情故事呢,等近不急待的看完了整部 才發現原...