问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C语言缓冲区在哪里

发布网友 发布时间:2022-04-22 03:28

我来回答

5个回答

热心网友 时间:2023-08-20 14:00

  C语言中的缓冲区又称为缓存,它是内存空间的一部分。
  也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。
  C语缓冲区分为三种类型:1、全缓冲 2、行缓冲 3、不带缓冲。
  缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。

  举个例子,比如:
  从磁盘里取信息,先把读出的数据放在缓冲区,计算机再直接从缓冲区中取数据,等缓冲区的数据取完后再去磁盘中读取,这样就可以减少磁盘的读写次数,再加上计算机对缓冲区的操作大大快于对磁盘的操作,故应用缓冲区可大大提高计算机的运行速度。

热心网友 时间:2023-08-20 14:01

缓冲区具体在哪里是与操作系统、编译器相关的
以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的原理以及缓冲区在哪里,请你再提一个问我再回答

热心网友 时间:2023-08-20 14:01

系统内部的 和语言没关系 也没必要知道

----

FILE的那个只是c用来减少IO访问的一个中间层缓冲,不是原本的缓冲区。系统的缓冲区基本上你根本不可能知道在什么地方。像Windows这种系统那个缓冲区根本就没在用户层。

热心网友 时间:2023-08-20 14:02

内存位置你就不需要关心了。至于大小,可以去看stdin和stdout的结构定义,可以查到缓冲区大小的定义。

热心网友 时间:2023-08-20 14:03

涐以后也要学c语言、但涐也不知道是干什么的、
停别人说特别难学、诶、、
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
武汉民政职业学院地址在哪里 全国有哪些民政学院 武汉民政学院 北京哪些区较好 北京哪个区环境好 北京海淀区属于什么档次 北京市哪个区最好 北京哪个区房子最好 递延是什么意思通俗 婚后是不是一定要自己买房子才可以结婚呢? 如何理解字符串缓冲区 C语言中缓冲区的问题,到底什么是全缓冲和行缓冲?? 缓冲区是什么? C++的流缓冲区类什么意思,像streambuf,filebuf... 我的就是空壳公司,可以按简易注销,请问一下需要... 注册个公司最低要多少钱?空壳公司都可以。就是没... 我注册了一个空壳公司。 需要缴纳什么税? 注册空壳公司需要多少钱? 注册一个空头公司一年要多少钱,50分,回答满意了... 开一家空壳公司多少钱? 请问如何注册马来西亚、印尼或者泰国的空壳公司?... 注册皮包公司需要多少钱 注册一个500万的公司不使用一年管理费多少钱? 注册个空壳公司要多少钱?公司注册资金百十万的都可以 注册一个空壳公司得多少钱?我想在大连开一家。 我想注册一家建筑空壳公司,大概年维护费是多少 注册一个空壳公司多少钱 如何注册一个空壳公司?需要多少钱呢?需要具备什... 开个空头公司一年下来要交多少钱 包括税什么的 想注册一个50w的皮包公司,一年大概开支多少钱? java.nio的缓冲区 什么是河流缓冲区?有什么用?具体介绍一下 ios中有没有类似buffer的缓冲区域 什么是缓冲区啊? 核心区实验区缓冲区怎么划分 java中的字符串缓冲区是什么意思? 缓冲区类的病毒会对电脑产生的危害 如何利用arcgis建立缓冲区 arcgis怎么做缓冲区 opengl书籍中的缓冲区指的是什么? 标准printf函数用的是什么类型的缓冲? 缓冲区溢出攻击的基本原理是什么? 小米平板 咋用 手机卡 打电话啊 微博名字怎么设置到中间 怎么把微博字设置到中间 怎么把微博文字弄到中间 怎样将新浪微博标签移至中间 微博字体怎么改到中间 微博标志怎么弄到中间。没看到个人设置在哪 微博上传的照片下面的微博ID怎样放到中间?