关于C语言sprintf中buffer参数及相关概念的技术疑问
关于C语言中Buffer的常见问题解答
问题1:程序中的buffer是需要编写程序时自行声明(如同声明数组),还是计算机中原本就存在的?
- 业务代码里用来临时存数据的buffer,需要你自行声明,比如用
char buffer[50]这类方式创建数组作为buffer; - 计算机系统和标准库层面确实存在自带的buffer,比如标准I/O库(
printf、fread等函数依赖的)会自动维护输入输出缓冲区,这类buffer不需要手动声明,但和你业务代码里自定义的buffer不是一回事。
问题2:当声明char buffer[MAX_LENGTH]时,该变量是否属于buffer?
- 首先要明确:buffer是功能概念,指临时存储数据的一块内存区域,不是特定的变量类型;
- 你声明的这个数组,本质就是一块可用来临时存数据的内存,完全符合buffer的定义,属于用数组实现的buffer。
问题3:《Pointers On C》提到sprintf()会将值写入buffer,其函数原型为int sprintf(char*buffer,char const * format,...),请问该原型中的buffer是真正的buffer还是仅名为buffer的数组?
- 原型里的
char* buffer只是参数名称,它指代的是任意一块可写的连续内存区域——只要能承担临时存储数据的功能,不管是你声明的数组,还是malloc动态分配的内存块,都可以作为这个参数传入,它本质就是功能意义上的buffer。
关于示例代码的补充疑问
- 示例里的
char buffer[50]是普通数组,但同时也是buffer:数组是它的实现形式,buffer是它的功能定位——用来临时存储sprintf生成的字符串; - 它和I/O中的buffer是不同层面的东西:I/O buffer是标准库维护的,目的是减少系统调用次数(比如攒够数据再一次性写入内核);自定义数组buffer是业务层面的,用来存放自己处理的数据;
- 函数参数命名为
buffer而非arr,是为了体现它的功能:这个参数的核心作用是作为临时存储数据的缓冲区,buffer这个名字更贴合它的用途,而arr只强调了数组的类型,无法体现功能定位。
内容的提问来源于stack exchange,提问作者zhm
相关产品推荐
相关产品推荐

