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

使用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快速定位:

  1. 编译时加上调试符号:gcc your_code.c -o your_program -g
  2. 启动gdb:gdb ./your_program
  3. 运行程序:run
  4. 触发段错误后,输入bt查看调用栈,就能精准定位到哪一行代码出问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:24:07