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

为何使用strcpy复制字符串会触发Segmentation fault (core dumped)错误?

问题分析与解决

错误原因

你用strcpy触发段错误的核心问题是没给transfer_file_list[token_count]分配实际存储字符串的内存:

  • realloc(transfer_file_list, (token_count + 2) * sizeof(char *))只是扩容了「指针数组」的空间——让数组能多装几个char*类型的指针,但这些指针本身都是野指针,指向的是不确定的非法内存区域。直接用strcpy往野指针指向的地址写数据,必然触发内存访问错误。
  • 而strdup(token)会自动完成两步操作:先根据token的实际长度分配足够的内存,再把token的内容复制过去,最后返回这块内存的指针,所以能正常运行。

正确代码示例

用strcpy的实现

transfer_file_list = realloc(transfer_file_list, (token_count + 2) * sizeof(char *));
// 先为当前字符串分配内存:strlen(token)+1 包含字符串本身和结束符'\0'
transfer_file_list[token_count] = malloc(strlen(token) + 1);
if (transfer_file_list[token_count] == NULL) {
    // 处理内存分配失败的情况,避免内存泄漏
    perror("malloc failed");
    for (int i = 0; i < token_count; i++) {
        free(transfer_file_list[i]);
    }
    free(transfer_file_list);
    return NULL;
}
strcpy(transfer_file_list[token_count], token);
token_count++;
transfer_file_list[token_count] = NULL; // 标记数组末尾,方便外部遍历

用strncpy的更安全实现(避免超长字符串溢出)

transfer_file_list = realloc(transfer_file_list, (token_count + 2) * sizeof(char *));
// 按定义的MAX_PATH_LENGTH分配内存,预留结束符空间
transfer_file_list[token_count] = malloc(MAX_PATH_LENGTH);
if (transfer_file_list[token_count] == NULL) {
    perror("malloc failed");
    // 清理已分配内存,防止泄漏
    for (int i = 0; i < token_count; i++) {
        free(transfer_file_list[i]);
    }
    free(transfer_file_list);
    return NULL;
}
// 最多复制MAX_PATH_LENGTH-1个字符,手动补结束符
strncpy(transfer_file_list[token_count], token, MAX_PATH_LENGTH - 1);
transfer_file_list[token_count][MAX_PATH_LENGTH - 1] = '\0';
token_count++;
transfer_file_list[token_count] = NULL;

额外注意事项

  1. 每次malloc后必须检查返回值,避免内存分配失败导致后续错误
  2. 外部使用完transfer_file_list后,要先逐个释放每个字符串的内存,再释放指针数组本身,彻底避免内存泄漏
  3. 必须加上transfer_file_list[token_count] = NULL;,这样外部遍历数组时才能识别结束位置

内容的提问来源于stack exchange,提问作者이호섭

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 16:27:39