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

调用函数时出现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 03:40:39