Segmentation fault的原因和例子

最近有用cpp写点东西,然后就碰到Segmentation fault了,调试的时候,ide指出报错的地方看着没问题。后来研究发现,是递归层数太多导致的。

“Segmentation fault”(简称"segfault")是一个常见的计算机程序错误,通常发生在试图访问计算机内存中未分配(或不允许)的部分时。这种错误在多种操作系统和编程语言中都可能发生,尤其是在使用C或C++等低级语言时更为常见,因为这些语言允许程序员直接操作内存地址。

以下是一些可能导致"Segmentation fault"的原因:

  1. 空指针解引用

    • 访问一个未初始化的指针或已经被释放的指针。
    int *ptr = NULL;
    *ptr = 10;  // 空指针解引用,导致段错误
    
  2. 越界访问数组

    • 访问数组的边界之外的元素。
    int arr[10];
    arr[10] = 5;  // 越界访问,导致段错误
    
  3. 栈溢出

    • 递归调用过深或使用过多的栈空间。
    void recurse() {
        recurse();
    }
    
    int main() {
        recurse();  // 栈溢出,导致段错误
        return 0;
    }
    
  void recursiveFunction(int depth) {
   	if (depth == 0) return;
  		 recursiveFunction(depth - 1);
   }
   recursiveFunction(100000000);
  1. 使用已经释放的内存

    • 访问已经被释放的内存区域(悬挂指针)。
    int *ptr = (int *)malloc(sizeof(int));
    free(ptr);
    *ptr = 10;  // 使用已经释放的内存,导致段错误
    
  2. 错误的函数指针

    • 调用一个无效的或未初始化的函数指针。
    void (*func)();
    func();  // 调用未初始化的函数指针,导致段错误
    
  3. 跨线程操作

    • 线程不安全的内存访问,导致数据竞争和非法内存访问。
  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值