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; }
排查小技巧
- 打印调试:在
findMax函数的循环里,每次打印arr[i]的值和maxPtr的地址,看看是不是出现了越界或者指针指向奇怪地址的情况。 - 检查指针来源:确认你返回的指针是指向传入的数组(而不是局部数组),传入的数组在
main函数里是全局/栈上有效的内存。 - 核对输入逻辑:确保
scanf正确读取了10个元素,没有漏写&符号。
内容的提问来源于stack exchange,提问作者Tumul Kumar
相关产品推荐
相关产品推荐

