使用strtok触发Segmentation Fault (core dumped),CSV数据存入char*[]后访问崩溃
嘿,我来帮你揪出这个段错误的元凶!从你描述的情况来看,虽然pTokens数组看起来填充成功了,但访问元素时触发Segmentation Fault,十有八九是内存管理或者字符串指针的指向出了问题,我给你列几个最常见的坑和解决方向:
一、先排查数组本身的内存合法性
- 如果你是静态声明的指针数组(比如
char* pTokens[100];),要确认CSV里的元素数量没有超过数组的预设大小——一旦越界写入,后续访问数组元素时就会踩进无效内存,直接触发段错误。 - 如果是动态分配的数组(比如用
malloc),检查分配逻辑是否正确:比如pTokens = malloc(num_elements * sizeof(char*));,这里的num_elements是不是准确统计了CSV里的元素个数?有没有漏算或者多算?
二、重点检查字符串的存储方式(最容易踩坑!)
很多人会犯这个错:解析CSV时把临时缓冲区的地址直接塞给pTokens的元素,比如:
char buf[256]; // 解析CSV到buf里 pTokens[i] = buf; // 错误!
栈上的buf会在循环迭代或者函数结束后被覆盖,导致pTokens里的指针指向的是已经失效的内存,后续访问自然就炸了。
正确的做法是给每个字符串单独分配内存:
// 方法1:用strdup(自动分配内存并复制字符串) pTokens[i] = strdup(buf); // 方法2:手动分配+复制 size_t len = strlen(buf); pTokens[i] = malloc(len + 1); // 要加1存字符串结束符'\0' if (pTokens[i] == NULL) { // 记得处理内存分配失败的情况 perror("malloc failed"); exit(EXIT_FAILURE); } strcpy(pTokens[i], buf);
另外还要注意:如果CSV里有空字段,有没有处理这种情况?要是直接把空指针或者未初始化的指针塞进数组,访问时也会触发段错误。
三、访问元素时的边界检查
访问pTokens[index]之前,一定要确认index在合法范围内(0 ≤ index < 实际元素个数)。越界访问数组之外的内存,也是段错误的常见原因之一。可以加个简单的判断:
if (index >= 0 && index < token_count) { printf("Token at %d: %s\n", index, pTokens[index]); } else { fprintf(stderr, "Error: Index %d is out of bounds!\n", index); }
四、调试小技巧
如果还是找不到问题,用gdb快速定位:
- 编译时加上调试符号:
gcc your_code.c -o your_program -g - 启动gdb:
gdb ./your_program - 运行程序:
run - 触发段错误后,输入
bt查看调用栈,就能精准定位到哪一行代码出问题了。
内容的提问来源于stack exchange,提问作者Oppa
相关产品推荐
相关产品推荐

