gpt4 book ai didi

c - 为什么堆没有更早损坏?

转载 作者:行者123 更新时间:2023-11-30 18:16:59 27 4
gpt4 key购买 nike

我试图在较低的层次上理解 C 如何管理内存。我在网页上找到了一些代码,其目的是教您糟糕的内存管理有多糟糕 - 所以我复制并粘贴了它,并编译了:

int main(int argc, char **argv) {
char *p, *q;
p = malloc(1024);
q = malloc(1024);
if (argc >= 2)
strcpy(p, argv[1]);
free(q);
free(p);
return 0;
}

测试用例是使用通用命令执行的

/development/heapbug$ ./heapbug `perl -e 'print "A"x$K'`

对于$K < 1023我没想到会出现问题,但是对于$K = 1024我预计会发生核心转储,但没有发生。长话短说,我开始出现 $K > 1033 的段错误.

两个问题:1)为什么会发生这种情况?2)是否有一个公式可以说明系统的“容忍度”?

最佳答案

当您写入超出分配内存的范围时,您将调用 undefined behavior 。这意味着您无法准确预测程序的行为。它可能会崩溃,可能会输出奇怪的结果,或者可能看起来工作正常。

此外,进行看似无关的更改(例如添加未使用的局部变量或用于调试的 printf 调用)可能会改变未定义行为的表现方式,就像使用不同编译器或相同编译器进行编译一样具有不同的优化设置。

仅仅因为程序可能崩溃并不意味着它崩溃。

话虽这么说,可能发生的情况与malloc在您的系统上的实现方式有关。它可能会比对齐和簿记目的所要求的字节多留出几个字节。如果没有积极的优化,这些用于对齐的额外字节可能不会用于其他任何用途,因此您在写入它们时会感到困惑,但是当您写入的字节数超出了 malloc 使用的内部结构时,就会出现问题> 并释放您损坏的内容。

但同样,您不能依赖这种行为。 C 取决于开发人员是否遵守规则,如果不遵守规则,就会发生不好的事情。

关于c - 为什么堆没有更早损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55752922/

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