#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程序导致分段错误,直到程序崩溃。但是,正如我的代码现在一样,它只是无限期地运行?我认为因为堆太大而需要一段时间才能耗尽。如何让我的程序打破堆?
答案 0 :(得分:0)
与内存中的操作相比,屏幕上的打印速度非常慢,因此如果删除printfs,您可能不必等待很长时间。
但是现代计算机有很多内存,当你考虑到磁盘上的交换空间时,它可能会有数百千兆字节。准备等待很长时间。
另外,在C中,字符串是NUL终止的,所以字符串&#34; a&#34;和&#34; b&#34;两者都需要两个字符存储。因此,您对strcpy
的调用会覆盖可能用于其他内容的内存,因此您的程序行为未定义。任何事情都可能发生,例如它被卡住而且永远不会终止。
旁注:我不确定您期望++a_heap_pointer;
会产生什么影响?您递增该指针,但随后立即用malloc
的返回值替换递增的值,因此将永远不会使用递增操作的结果。