我知道缓冲区溢出是什么。我不知道缓冲区下溢是什么。
我猜这是特定缓冲区收到而不是字节溢出,字节下溢。
char buffer[8];
fgets(buffer, sizeof(buffer), stdin);
上述情况不会出错。
char buffer_overflow[8];
fgets(buffer_overflow, 16, stdin);
如果用户输入是例如" deutschland"上面会导致缓冲区溢出。
我可以在代码中获得一个示例,缓冲区下溢是什么?
答案 0 :(得分:19)
缓冲区下溢与缓冲区溢出无直接关系。然而,缓冲器下溢可能是例如问题。环缓冲区。
考虑例如音频播放:您的音频缓冲区可能是内核内存中的某个环形缓冲区。如果写入的数据比从缓冲区读取的音频驱动程序/硬件慢,则缓冲区变空("下溢"),导致音频卡顿。其他类型的实时数据处理和媒体播放也存在类似的问题。
因此缓冲区下溢本身通常不是故障条件(与缓冲区溢出不同,缓冲区溢出通常会导致程序执行未定义的,不需要的行为,如终止,执行一些不需要的代码等等。)
答案 1 :(得分:5)
我偶尔会听到这个词用来指在缓冲区开头之前错误地读取。我不知道这个词的用法是否“正确”。
举个例子,考虑一下这个有缺陷的堆栈实现。
struct fixed_size_stack
{
int top;
int data[128];
};
int
fixed_size_stack_pop(struct fixed_size_stack * this)
{
return this->data[--(this->top)];
}
if (this->top > 0)
的缺失检查将导致函数读取数组的下限,如果请求已经空堆栈的弹出。
答案 2 :(得分:0)
答案 3 :(得分:-4)
我知道现在回答这个问题已经太晚了。之前的所有答案都令人满意,我只是觉得一个例子会更有意义。
#include<stdio.h>
int main(){
unsigned int u=-1;
printf("%u",u);
return 0;
}
Output: 4294967295
这是环形缓冲区下溢的一个简单示例。我们知道unsigned int不能代表负值。但是,如果我们将-1
分配给u
,则u
中的值现为4294967295
。这是2^32 -1
,这是unsigned int
可以存储的最高值。存储值低于最低产量的最高值。这是下溢。希望这会有所帮助。