C语言使用strsep处理CSV文件触发Segmentation fault段错误求助
段错误核心原因及修复方案
直接崩溃原因
strsep 遍历完字符串所有分隔符之后会返回NULL,你没有对返回值做空判断就直接调用strlen(p),访问空指针直接触发段错误。
其他隐藏的致命问题
- 参数类型不匹配错误
strsep第一个入参要求是char **类型,你定义的criarUser形参是char *str,调用时还传入了数组指针&string,类型完全不匹配,导致strsep操作的指针地址完全错误。 - 内存分配大小错误
你把Usertypedef成了结构体指针类型,malloc(sizeof(User))实际只分配了指针大小的内存(64位系统下仅8字节),远小于结构体本身需要的内存大小,后续操作会触发堆内存越界。 - 固定循环次数逻辑错误
你强制循环10次读取字段,当某一行的字段数少于10时,strsep会提前返回NULL,后续无意义的调用只会拿到空指针。
修复示例
- 先修正结构体定义,避免把指针藏在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;
- 修正
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; }
- 修正调用逻辑:
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
相关产品推荐
相关产品推荐

