gpt4 book ai didi

operating-system - 堆栈与缓冲区

转载 作者:行者123 更新时间:2023-12-04 22:36:36 26 4
gpt4 key购买 nike

缓冲区和堆栈有什么区别?缓冲区溢出和堆栈溢出是一回事吗?

谢谢你。

最佳答案

堆栈溢出通常是由无节制的递归引起的(尽管如果您没有足够的堆栈空间用于正常级别的函数调用,例如嵌入式系统,或者甚至是有限的递归,则它可能会在事件的正常过程中引起,如果限制太高)。下面是一个例子:

void f (void) {
f();
}
int main (void) {
f();
return 0;
}

在那个例子中, f() 函数非常愚蠢地调用自己,每次调用它时,它都会分配一个堆栈帧,这最终会导致堆栈溢出。

另一方面,缓冲区溢出是由超出缓冲区末尾的写入引起的。它们经常被混淆,因为堆栈上的缓冲区溢出通常会破坏堆栈,但从技术上讲,它们是非常不同的东西。基于堆栈的缓冲区溢出的示例是:
void f (void) {
char str[10];
strcpy (str, "This is far too long to fit");
}

这可能会破坏堆栈,因为您试图将一个 27 个字符的字符串(28 个字节)插入一个只有 10 个字节大小的空间中。

但是缓冲区溢出不一定必须在堆栈上。如果缓冲区是从堆中分配的(例如,使用 malloc ),那么它很有可能会破坏内存领域,如下所示:
void f (void) {
char *blk = malloc (10);
if (blk != 0) {
memset (blk, ' ', 100);
free (blk);
}
}

与前面的示例类似,除了缓冲区溢出不会破坏堆栈。而是写入超出堆中缓冲区末尾的内容。

关于operating-system - 堆栈与缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5296758/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com