深入剖析printf

2021-08-05 22:49:56 字數 791 閱讀 8805

printf主要是給控制台列印字串或者數字等。

1、printf的引數列表printf ( const char *format,   ...  )

2、printf首先呼叫va_start.然後呼叫_output_l,最後呼叫_ftbuf

3、_output_l會解析字串並呼叫va_arg,獲取省略號的值,呼叫write_string寫到控制台上。

4、write_string會呼叫write_char,write_char會呼叫_putc_nolock,最終呼叫_flsbuf。

之前有人問printf("%f",1);為什麼列印的是0。

因為這種情況在va_arg(vl,double)獲取到值是0

printf的va_arg的彙編**如下:

623d9a24  mov         edx,dword ptr [ebp+14h]

623d9a27  add         edx,8

623d9a2a  mov         dword ptr [ebp+14h],edx

623d9a2d  mov         eax,dword ptr [ebp+14h]

623d9a30  mov         ecx,dword ptr [eax-8]

623d9a33  mov         edx,dword ptr [eax-4]

623d9a36  mov         dword ptr [tmp],ecx

623d9a3c  mov         dword ptr [ebp-29ch],edx

剖析printf函式

printf是什麼,對於起初學習c語言的同學來說肯定都特別的疑惑。在這裡,解答一下 它是乙個函式。既然是乙個函式的話,想必肯定有返回值和引數吧。那麼它的返回值和引數是什麼呢?1 看一下這個例子,可能更好理解點 這個看起來只是個printf函式,但它卻在printf函式基礎上巢狀了好幾層printf,...

PGA深入剖析

pga pga系統全域性區 program global area 程序全域性區 process global area pga是乙個記憶體區域,該區域包含了一些與某個特定伺服器程序相關的資料和控制資訊,每個程序都有自己的私有pga區,所以這塊區域只能被其所屬程序進入,而不能被其他程序訪問,所以在p...

epoll LT ET 深入剖析

epoll lt et 深入剖析 epoll事件有兩種模型 level triggered lt 水平觸發 socket接收緩衝區不為空 有資料可讀 讀事件一直觸發 socket傳送緩衝區不滿 可以繼續寫入資料 寫事件一直觸發 符合思維習慣,epoll wait返回的事件就是socket的狀態 ed...