先看看这段代码。

```cpp
index = 1000;
char file[1];
sprintf(file,"%d",index);
```

或许有人会说第三行越界了,但实际情况是这样吗?答案是否定的,程序依旧能够正常地运行。这是怎么一回事呢?
我们先来从这个sprintf函数来分析:

> int sprintf( char *buffer, const char *format, [ argument] … );

这个函数的作用是把格式化的数据写入某个字符串`缓冲区`。第一个参数是buffer,char型指针,指向将要写入的字符串的`缓冲区`。

> **什么是缓冲区**缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。
缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。

所以说这段程序能够正常运行的原因是index被格式化写入了file[]的缓冲区而非该字符串所指向的内存。
但是该函数存在一个问题——对于写入buffer的字符数是没有限制的,这就导致buffer有可能溢出。所以建议使用安全的snprintf函数替代,该函数可以对写入字符数进行限制。
总而言之,合理利用缓冲区可以使程序更加灵活,但是反之则会导致一些蛋疼的问题。

Last modification:July 20, 2016
博客维护不易,如果你觉得我的文章有用,请随意赞赏