c - Heapcrash - 通过增加指向堆的指针来段错误

标签 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 程序引起段错误。但是,就我的代码现在而言,它只是无限期地运行?我猜想是因为堆太大了,需要一段时间才能用完。如何让我的程序打破堆?

最佳答案

与内存中的操作相比,在屏幕上打印非常慢,因此如果删除 printfs,您可能不需要等待那么长时间。

但是现代计算机拥有大量内存,当考虑到磁盘上的交换空间时,它可能会达到数百 GB。做好长时间等待的准备。

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

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

关于c - Heapcrash - 通过增加指向堆的指针来段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46940186/

相关文章:

c - C编程中数据类型 `long`

c - C 中的结构体初始化和打印

android - 我的应用程序在使用泄漏金丝雀时卡住 - 为什么?

c++ - 在具有不同 CRT 的库中使用 shared_ptr<T>

c - 用 C 写入文件不起作用

c++ - 从 DWORD 中提取 lo 和 hi 字时为什么需要二进制移位?

C++ 高效使用 new 运算符

Node.js 由于内存不足而被杀死

C和MPI : function works differently with same data

database - 为什么 autovacuum 进程没有取回内存