當前位置:首頁 » 編程語言 » 緩沖區c語言

緩沖區c語言

發布時間: 2024-08-24 13:12:02

『壹』 c語言中buffer到底是什麼意思是數組緩沖區為什麼一般C程序中都不定義他直接拿來用呢

C語言中buffer是緩沖區的意思。

不定義是不能拿過來直接用的,因為它肯定是在別的地方定義的,比如頭文件,或者是個全局變數等。一般是在編譯器裡面,右鍵這個變數,選gotodifination就可以看到它在哪定義的了。

緩沖區它是內存空間的一部分。也就是說,在內存空間中預留了一定的存儲空間,這些存儲空間用來緩沖輸入或輸出的數據,這部分預留的空間就叫做緩沖區。

(1)緩沖區c語言擴展閱讀

C語言循環buffer的實現

#ifdefined(__CIRCLE_BUFFER__)

//"circle_buffer.h"

#ifndef__CIRCLE_BUFFER_H__

#define__CIRCLE_BUFFER_H__

#ifdefined(__CIRCLE_BUFFER__)

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

#include<assert.h>

typedefunsignedcharcb_u8;

typedefunsignedshortintcb_u16;

typedefunsignedintcb_u32;

typedefsignedcharcb_s8;

typedefsignedshortintcb_s16;

typedefsignedintcb_s32;

typedefcharcb_char;

typedefenum{cb_false,cb_true}cb_bool;

typedefstruct{

cb_u8*bufptr;

cb_u32buflen;

cb_u32datalen;

cb_u32readpos;

cb_u32writepos;

}CircleBufferMngr;

typedefstruct{

void(*cb_init)(CircleBufferMngr**,cb_u32);

void(*cb_deinit)(CircleBufferMngr**);

void(*cb_info)(CircleBufferMngr*,cb_char*,cb_u32);

cb_u32(*cb_read)(CircleBufferMngr*,cb_u8*,cb_u32);

cb_u32(*cb_write)(CircleBufferMngr*,cb_u8*,cb_u32);

cb_u32(*cb_datalen)(CircleBufferMngr*);

cb_bool(*cb_full)(CircleBufferMngr*);

cb_bool(*cb_empty)(CircleBufferMngr*);

}CircleBufferApi;

#defineCB_MEMCPYmemcpy

#defineCB_MEMSETmemset

#defineCB_SPRINTsprintf

#defineCB_MALLOCmalloc

#defineCB_MFREEfree

#defineCB_ASSERTassert

#defineCB_SNPRINTsnprintf

#defineCB_TRACEprintf

//鎖定,禁止中斷和任務調度

#defineCB_GLOBAL_LOCK

#defineCB_GLOBAL_UNLOCK

;

#defineCBMA_INITcircleBufApi.cb_init

#defineCBMA_DEINITcircleBufApi.cb_deinit

#defineCBMA_INFOcircleBufApi.cb_info

#defineCBMA_READcircleBufApi.cb_read

#defineCBMA_WRITEcircleBufApi.cb_write

#defineCBMA_DATALENcircleBufApi.cb_datalen

#defineCBMA_FULLcircleBufApi.cb_full

#defineCBMA_EMPTYcircleBufApi.cb_empty

#endif/*__CIRCLE_BUFFER__*/

#endif/*__CIRCLE_BUFFER_H__*/

『貳』 C語言緩沖區在哪裡

緩沖區具體在哪裡是與操作系統、編譯器相關的
以VC++為例。察看getchar的源代碼(src\fgetchar.c),有:
int __cdecl _fgetchar (void){
return(getc(stdin));
}
#undef getchar
int __cdecl getchar (void){
return _fgetchar();
}
可見getchar()相當於getc(stdin)

繼續察看getc(src\fgetc.c),有一段(為便於閱讀,有刪減):
int __cdecl getc (FILE *stream){
int retval;
_ASSERTE(stream != NULL);
_lock_str(stream);
__try {
retval = _getc_lk(stream);
}
__finally {
_unlock_str(stream);
}
return(retval);
}

這段代碼里_lock_str其實是通過Win32 API提供的臨街區來鎖住文件
接收用戶輸入發生在_getc_lk,_getc_lk宏調用_filbuf。_filbuf在_filbuf.c中可以查看,這段代碼比較長,就不貼出來了
_filbuf主要是調用了_read(_fileno(stream), stream->_base, stream->_bufsiz)

而_read最終則是調用了Win32API ReadFile,以下是用WinDbg輸出的getchar的調用棧:
# ChildEBP RetAddr
00 0012fe6c 0040a4e7 kernel32!ReadFile
01 0012fea8 0040a3b9 TestStruct!_read_lk+0x107 [read.c @ 146]
02 0012fec0 00403140 TestStruct!_read+0x69 [read.c @ 75]
03 0012fee8 00401290 TestStruct!_filbuf+0xd0 [_filbuf.c @ 127]
04 0012ff08 004012cc TestStruct!fgetc+0x80 [fgetc.c @ 44]
05 0012ff14 0040103d TestStruct!getc+0xc [fgetc.c @ 56]
06 0012ff20 00401058 TestStruct!_fgetchar+0xd [fgetchar.c @ 37]
07 0012ff28 0040101e TestStruct!getchar+0x8 [fgetchar.c @ 47]
08 0012ff80 0040115c TestStruct!main+0xe [d:\my programs\teststruct\ts.cpp @ 4]
09 0012ffc0 7c816fe7 TestStruct!mainCRTStartup+0xfc [crt0.c @ 206]
0a 0012fff0 00000000 kernel32!BaseProcessStart+0x23

可見,getchar最終調用了ReadFile。關於ReadFile的原理以及緩沖區在哪裡,請你再提一個問我再回答

熱點內容
視頻壓縮安卓 發布:2024-11-25 13:02:18 瀏覽:341
當貝上傳應用 發布:2024-11-25 13:01:23 瀏覽:272
中國聯通湖北伺服器地址 發布:2024-11-25 13:00:38 瀏覽:747
訪問內網計算機 發布:2024-11-25 12:37:53 瀏覽:969
蘋果文件夾名字大全 發布:2024-11-25 12:28:03 瀏覽:590
ipad上b站緩存分屏 發布:2024-11-25 12:27:59 瀏覽:981
資料庫日誌文件查看 發布:2024-11-25 12:17:28 瀏覽:48
騰訊視頻明明緩存了看不了 發布:2024-11-25 12:08:01 瀏覽:182
存儲區域網路分布 發布:2024-11-25 12:07:12 瀏覽:389
安卓怎麼用湯不熱 發布:2024-11-25 11:49:06 瀏覽:844