在 C 中导致段错误 |堆栈虚拟内存

标签 c memory-management heap-memory virtual-memory stack-memory

#include <stdio.h>

int main() {
  char *ptr;

  while(1){ 
    ++ptr; 
    printf("%p\n", ptr); 
  }
  return 0;
}

问题:你的代码应该递增一个指向 heap, by 1 byte, 重复,直到程序崩溃。

我试图通过遍历堆栈中的所有地址来创建段错误,一次一个字节。但是,代码只是继续运行,不会导致段错误。我怎么能改变它导致段错误?

最佳答案

要获取指向堆栈的指针,请将其设置为局部变量的地址:

int main() {
    int object;
    int *p = &object;

但是,简单地递增指针不会导致段错误。要获得段错误,您需要取消引用无效指针。所以循环应该是这样的:

    while(1) {
        ++ptr;
        printf("%p %d\n", ptr, *ptr);
    }

尝试打印 *ptr 最终会导致错误。

对于堆,您可以类似地执行此操作,但通过调用 malloc() 而不是局部变量的地址来初始化 p

关于在 C 中导致段错误 |堆栈虚拟内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46943483/

相关文章:

sql - 嵌入式 SQL - 没有输出?

c - 从预分配内存中直接读取 C 中的结构失败

c - 只有一个元素的数组的意义

java - 减少 JVM 中未使用的堆大小

c - 使用 cvVideoWriter 时 OpenCV 2.3.1 highgui 在退出时崩溃

memory-management - 在ARMv8中,如果全局页表项在不同进程之间发生冲突会发生什么?

c - 当 C 中的静态分配没有足够的内存时会发生什么?

安卓拍照成功

Java 堆空间 Xmx Xms 参数忽略

python - 如何迭代具有重复值的列表?