You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言程序运行出现Segmentation fault 11问题求助

解决C语言返回数组最大元素指针时的Segmentation Fault问题

嘿,刚接触指针的时候碰到这种问题太正常了!Segmentation Fault(段错误)本质是程序访问了不属于它的内存空间,咱们先梳理几个新手最容易踩的坑,再给你一个能正常运行的示例代码,帮你快速定位问题。

常见的错误原因

  • 返回局部变量的指针:如果你的findMax函数里定义了一个局部数组(比如int temp[10];),然后返回这个数组的指针,那函数执行完毕后,局部数组的内存会被系统回收,后续访问这个指针就会触发段错——这是新手最常犯的错误!
  • 数组越界访问:数组长度是10,下标范围是0~9,如果循环条件写成i <= 10,就会访问arr[10](超出数组边界的内存),直接触发段错。
  • 输入时的地址错误:用scanf读取元素时,漏写了&符号(比如写成scanf("%d", numbers[i])),会把输入值写到错误的内存地址里,导致后续操作混乱。

正确的示例代码

#include <stdio.h>

// 接收长度为10的数组,返回指向最大元素的指针
int* findMax(int arr[10]) {
    // 初始化指针指向数组第一个元素
    int* maxPtr = &arr[0];
    // 从第二个元素开始遍历比较
    for (int i = 1; i < 10; i++) {
        if (arr[i] > *maxPtr) {
            // 更新指针为当前更大元素的地址
            maxPtr = &arr[i];
        }
    }
    return maxPtr;
}

int main() {
    int numbers[10];
    printf("请输入10个整数:\n");
    // 循环读取10个元素,注意传地址&numbers[i]
    for (int i = 0; i < 10; i++) {
        scanf("%d", &numbers[i]);
    }
    
    int* maxElementPtr = findMax(numbers);
    printf("最大元素值:%d,对应的内存地址:%p\n", *maxElementPtr, maxElementPtr);
    return 0;
}

排查小技巧

  1. 打印调试:在findMax函数的循环里,每次打印arr[i]的值和maxPtr的地址,看看是不是出现了越界或者指针指向奇怪地址的情况。
  2. 检查指针来源:确认你返回的指针是指向传入的数组(而不是局部数组),传入的数组在main函数里是全局/栈上有效的内存。
  3. 核对输入逻辑:确保scanf正确读取了10个元素,没有漏写&符号。

内容的提问来源于stack exchange,提问作者Tumul Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:39:07