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

C语言使用strsep处理CSV文件触发Segmentation fault段错误求助

段错误核心原因及修复方案

直接崩溃原因

strsep 遍历完字符串所有分隔符之后会返回NULL,你没有对返回值做空判断就直接调用strlen(p),访问空指针直接触发段错误。

其他隐藏的致命问题

  • 参数类型不匹配错误
    strsep 第一个入参要求是char **类型,你定义的criarUser形参是char *str,调用时还传入了数组指针&string,类型完全不匹配,导致strsep操作的指针地址完全错误。
  • 内存分配大小错误
    你把User typedef成了结构体指针类型,malloc(sizeof(User))实际只分配了指针大小的内存(64位系统下仅8字节),远小于结构体本身需要的内存大小,后续操作会触发堆内存越界。
  • 固定循环次数逻辑错误
    你强制循环10次读取字段,当某一行的字段数少于10时,strsep会提前返回NULL,后续无意义的调用只会拿到空指针。

修复示例

  1. 先修正结构体定义,避免把指针藏在typedef里减少出错:
// 不要把指针写在typedef里,分开定义
typedef struct {
    int id, followers, following, public_gists; 
    int public_repos;
    char *login;
    char *type;
    char *created_at;
    int *follower_list;
    int *following_list;
} User;
typedef User* PUser;
  1. 修正criarUser的参数和逻辑:
PUser criarUser(char **str) {
    PUser novoUser = malloc(sizeof(User)); // 分配整个结构体的大小
    if (!novoUser) return NULL;
    
    for(int i = 0; i < 10; i++) {
        char *p = strsep(str, ";\n\r");
        // 先判断空再做操作
        if (p == NULL || strlen(p) == 0) {
            count++;
            free(novoUser);
            return NULL;
        }
        // 这里补充把p赋值给对应结构体成员的逻辑
    }
    return novoUser;
}
  1. 修正调用逻辑:
while ((fgets(string, 200000, file))) {
    if (string[0] != '\0') {
        char *ptr = string; // 定义临时指针,因为数组名不能被修改
        PUser user = criarUser(&ptr);
        if (user != NULL) {
            printf("ok\n");
            // 后续要记得释放user里的char*类型成员,避免内存泄漏
        }
        free(user);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 13:36:03