#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void foo() {
char *a_heap_pointer;
a_heap_pointer = (char*)malloc(1 * sizeof(char));
strcpy(a_heap_pointer, "a");
printf("%s\n", a_heap_pointer);
while (1){
++a_heap_pointer;
a_heap_pointer = (char*)malloc(1 * sizeof(char));
strcpy(a_heap_pointer, "b");
printf("%s\n", a_heap_pointer);
}
}
int main (void) {
foo();
return 0;
}
您好,我正在尝试通过将指向堆的指针重复增加 1 个字节,直到程序崩溃,使我的 C 程序引起段错误。但是,就我的代码现在而言,它只是无限期地运行?我猜想是因为堆太大了,需要一段时间才能用完。如何让我的程序打破堆?
最佳答案
与内存中的操作相比,在屏幕上打印非常慢,因此如果删除 printfs,您可能不需要等待那么长时间。
但是现代计算机拥有大量内存,当考虑到磁盘上的交换空间时,它可能会达到数百 GB。做好长时间等待的准备。
此外,在 C 中,字符串以 NUL 结尾,因此字符串“a”和“b”都需要两个字符存储。因此,您对 strcpy
的调用会覆盖可能用于其他用途的内存,因此您的程序的行为是未定义的。任何事情都可能发生,例如它被卡住并且永远不会终止。
还有一个旁注:我不确定您期望 ++a_heap_pointer;
产生什么效果?您递增该指针,但随后立即用 malloc
的返回值替换递增的值,因此永远不会使用递增操作的结果。
关于c - Heapcrash - 通过增加指向堆的指针来段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46940186/