使用malloc在函数内定义数组并返回时出现Segmentation fault问题排查
段错误原因及修复方案
核心错误原因
- main函数中声明的
int *len;是未初始化的野指针,指向内存中的随机地址。当takeInput函数执行fscanf(fp, "%d", len);时,会尝试往这个随机地址写入数据,直接触发非法内存访问,导致段错误。
修复步骤
1. 修正main函数的指针使用
把main里的指针声明改为普通int变量,传递它的地址给takeInput函数:
int main() { int len; // 改为普通int变量,而非指针 int *arr = takeInput(&len); // 传递len的地址 printf("%d\n", len); // 直接使用len,无需解引用指针 free(arr); // 释放malloc分配的内存,避免内存泄漏 return 0; }
2. 补充必要的错误检查(可选但推荐)
为提升程序健壮性,需检查文件打开、内存分配及数据读取是否成功:
int *takeInput(int *len) { FILE *fp = fopen("process.txt", "r"); if (fp == NULL) { // 检查文件是否成功打开 perror("Failed to open file"); exit(EXIT_FAILURE); } if (fscanf(fp, "%d", len) != 1) { // 检查长度读取是否成功 perror("Failed to read length"); fclose(fp); exit(EXIT_FAILURE); } int *arr = malloc(sizeof(int) * (*len)); if (arr == NULL) { // 检查内存分配是否成功 perror("Failed to allocate memory"); fclose(fp); exit(EXIT_FAILURE); } for (int i = 0; i < (*len); i++) { if (fscanf(fp, "%d", &arr[i]) != 1) { // 检查数组元素读取是否成功 perror("Failed to read array element"); free(arr); fclose(fp); exit(EXIT_FAILURE); } } fclose(fp); return arr; }
修复后说明
修改后,len是有效的int变量,传递地址给takeInput后,函数可安全写入读取到的长度值。补充错误检查能及时捕获文件读取、内存分配失败的情况,避免程序崩溃或产生异常行为。
内容的提问来源于stack exchange,提问作者altair00
相关产品推荐
相关产品推荐

