Heapcrash - 通过增加指向堆的指针来seg故障

时间:2017-10-25 19:02:41

标签: c memory memory-management

#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程序导致分段错误,直到程序崩溃。但是,正如我的代码现在一样,它只是无限期地运行?我认为因为堆太大而需要一段时间才能耗尽。如何让我的程序打破堆?

1 个答案:

答案 0 :(得分:0)

与内存中的操作相比,屏幕上的打印速度非常慢,因此如果删除printfs,您可能不必等待很长时间。

但是现代计算机有很多内存,当你考虑到磁盘上的交换空间时,它可能会有数百千兆字节。准备等待很长时间。

另外,在C中,字符串是NUL终止的,所以字符串&#34; a&#34;和&#34; b&#34;两者都需要两个字符存储。因此,您对strcpy的调用会覆盖可能用于其他内容的内存,因此您的程序行为未定义。任何事情都可能发生,例如它被卡住而且永远不会终止。

旁注:我不确定您期望++a_heap_pointer;会产生什么影响?您递增该指针,但随后立即用malloc的返回值替换递增的值,因此将永远不会使用递增操作的结果。