调用函数时出现Segmentation Fault及指针类型不兼容问题排查
问题分析与修复方案
一、返回类型不匹配警告的原因与解决
函数声明返回unsigned int **,但你实际分配的是int **类型数组,两种指针类型不兼容,导致编译器抛出警告。解决方法是将数组类型统一为unsigned int **,对应内存分配的类型也要同步调整。
二、段错误的核心原因
代码存在多个触发段错误的问题:
- 变量名冲突+文件名错误:函数参数是
const char *file,但内部又定义了同名的FILE* file,覆盖了传入的文件名参数;同时fopen("file", "r")使用固定字符串"file"而非传入的文件名,导致打开错误文件(文件不存在则打开失败)。 - 未检查文件打开状态:
fopen失败会返回NULL,后续直接用该NULL指针调用fscanf,触发段错误。 - 未将读取的尺寸赋值回
s:你意图将读取到的数组尺寸赋值给size_t指针s指向的变量,但代码仅把*s初始给size,读取完成后未将size写回*s,既不符合需求,还可能因s是野指针提前触发段错误。 - 类型不匹配风险:用
int类型存储size,但size_t是无符号整数类型,若文件中数值超出int范围会导致溢出,后续内存分配也会出错。
修正后的代码
#include <stdio.h> #include <stdlib.h> unsigned int **city_array(const char *filename, size_t *s) { // 检查传入指针有效性 if (s == NULL || filename == NULL) { return NULL; } FILE* fp = fopen(filename, "r"); // 检查文件是否成功打开 if (fp == NULL) { return NULL; } size_t size; // 用size_t类型读取尺寸,避免溢出 if (fscanf(fp, "%zu", &size) != 1) { fclose(fp); return NULL; } // 将读取的尺寸赋值回s指向的变量 *s = size; // 分配unsigned int类型二维数组 unsigned int** arr = malloc(size * sizeof(unsigned int*)); if (arr == NULL) { fclose(fp); return NULL; } for (size_t i = 0; i < size; i++) { arr[i] = malloc(size * sizeof(unsigned int)); // 检查每行分配是否成功,失败则释放已分配内存 if (arr[i] == NULL) { for (size_t j = 0; j < i; j++) { free(arr[j]); } free(arr); fclose(fp); return NULL; } } // 初始化数组元素 for(size_t i = 0; i < size; i++){ for(size_t j = 0; j < size; j++){ arr[i][j] = (i == j) ? 0 : 1; } } fclose(fp); return arr; }
内容的提问来源于stack exchange,提问作者rin
相关产品推荐
相关产品推荐

