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

使用strcat()时触发Segmentation fault的问题求助

解决strcat()触发Segmentation Fault的问题

核心错误分析

你的代码里最致命的问题是**srt_cmm的指针覆盖**:

  • 你先通过malloc(500)在堆上分配了可写内存给srt_cmm,但紧接着执行srt_cmm = "sort ";,这会让srt_cmm直接指向只读数据段的字符串常量,完全丢失了之前malloc的堆内存地址。
  • strcat()需要修改目标字符串的内存空间,但字符串常量是只读的,写入操作直接触发段错误。

其他潜在问题

  • token未初始化就使用:strstr(token, str_chr1)里的token是野指针,直接访问会导致未定义行为,可能提前崩溃或逻辑混乱。
  • file_name内存管理错误:你先给file_name分配堆内存,之后又让它指向strtok返回的指针(通常指向输入字符串的栈内存区域),后续free(file_name)会尝试释放非堆内存,引发错误。
  • execvp参数格式错误:execvp的第二个参数要求是以NULL结尾的字符串数组,你传&srt_cmm不符合规范,会导致调用失败。

修复后的代码示例

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int main(int argc, char* argv[])
{
    // 示例:假设输入来自命令行或用户输入,先初始化token
    char input[] = "sort < test.txt";
    char* token = strtok(input, " ");
    char* file_name;
    char* srt_cmm = (char*)malloc(500);
    const char* str_chr1 = "<";

    // 检查malloc是否成功
    if (srt_cmm == NULL) {
        perror("malloc failed");
        exit(EXIT_FAILURE);
    }

    // 用strcpy将字符串常量复制到堆内存,而非直接赋值指针
    strcpy(srt_cmm, "sort ");

    while (token != NULL) {
        if (strstr(token, str_chr1) != NULL) {
            token = strtok(NULL, " ");
            file_name = token;

            // 检查缓冲区是否足够,避免溢出
            if (strlen(srt_cmm) + strlen(file_name) + 1 > 500) {
                fprintf(stderr, "Buffer overflow risk\n");
                free(srt_cmm);
                exit(EXIT_FAILURE);
            }
            strcat(srt_cmm, file_name);

            // 构建execvp要求的参数数组(以NULL结尾)
            char* args[] = {"sort", file_name, NULL};
            execvp("sort", args);

            // 若execvp返回,说明调用失败
            perror("execvp failed");
            free(srt_cmm);
            exit(EXIT_FAILURE);
        }
        token = strtok(NULL, " ");
    }

    free(srt_cmm);
    return 0;
}

关键修复点说明

  1. 用strcpy替代指针赋值:确保srt_cmm指向可写的堆内存,而非只读的字符串常量。
  2. 初始化token:必须让token先指向有效的输入字符串,避免野指针访问。
  3. 修正execvp参数:构建符合要求的字符串数组,让系统调用能正确识别命令参数。
  4. 检查缓冲区容量:避免strcat导致的缓冲区溢出,也可以用strncat进一步提升安全性。
  5. 合理管理内存:不再对file_name做不必要的malloc,直接使用strtok返回的指针即可(如需保存副本再单独分配内存)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 10:52:41