-1 c memory-management heap-memory
我试图在较低的层次上理解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;
}
Run Code Online (Sandbox Code Playgroud)
用通用命令执行测试用例
/development/heapbug$ ./heapbug `perl -e 'print "A"x$K'`
Run Code Online (Sandbox Code Playgroud)
因为$K < 1023
我没想到会有问题,但是因为我没想到$K = 1024
会发生核心转储。长话短说,我开始为segfaults $K > 1033
。
两个问题:1)为什么会这样?2)是否有一个公式可以说明系统的“容差”?
超出分配的内存范围写入时,将调用未定义的行为。这意味着您无法准确预测程序的行为。它可能会崩溃,它可能会输出奇怪的结果,或者它似乎可以正常工作。
同样,进行看似无关的更改(例如添加未使用的局部变量或printf
调用调试)可能会更改未定义行为的显示方式,就像使用其他编译器或具有不同优化设置的同一编译器进行编译一样。
仅仅因为程序会崩溃并不意味着它会。
话虽这么说,可能发生的事情与malloc
系统上的实现方式有关。它可能比对齐和簿记目的留出了更多字节。如果不进行积极的优化,那些多余的用于对齐的字节可能不会被用于其他任何事情,因此您在写入它们时会感到厌烦,但是当您进一步写入字节时可能会遇到问题,因为这些字节可能包含由其使用的内部结构,malloc
并且free
损坏了。
但同样,您不能依赖此行为。C依赖于开发人员遵守规则,如果不做不好,事情就会发生。
归档时间: |
|
查看次数: |
51 次 |
最近记录: |