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

如何解决拼接argv[]所有字符串时出现的seg fault问题?

问题分析与解决

你提供的代码尝试拼接命令行参数,但运行时出现段错误,核心问题如下:

#include <cs50.h>
#include <stdio.h>
#include <string.h>

int main(int argc, string argv[])
{
    string destination = argv[1];

    for (int i = 1; i < argc; i++)
    {
        strcat(argv[i], argv[i+1]);
    }
    printf("%s\n", destination);
}

错误原因

  • 只读内存不可修改:命令行参数存储在只读内存区域,直接用strcat修改argv[i]的内容会触发内存访问错误。
  • 数组越界访问:循环条件i < argc会导致当i = argc-1时,argv[i+1]等于argv[argc](该位置为NULL),strcat尝试访问空指针直接引发段错误。
  • 缓冲区空间不足:即便内存可写,argv[1]的初始空间仅能容纳自身字符串,拼接后续内容会超出缓冲区容量,破坏其他内存区域。

正确实现方式

需要先计算所有参数的总长度,动态分配足够内存,再完成拼接:

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

int main(int argc, string argv[])
{
    // 处理无输入参数的情况
    if (argc < 2)
    {
        printf("请输入至少一个命令行参数\n");
        return 1;
    }

    // 计算所有参数的总长度(含字符串结束符'\0')
    int total_len = 0;
    for (int i = 1; i < argc; i++)
    {
        total_len += strlen(argv[i]);
    }
    total_len += 1; // 预留'\0'的空间

    // 分配可写内存
    char *result = malloc(total_len);
    if (result == NULL)
    {
        printf("内存分配失败\n");
        return 1;
    }

    // 初始化结果字符串,逐个拼接参数
    result[0] = '\0';
    for (int i = 1; i < argc; i++)
    {
        strcat(result, argv[i]);
    }

    // 输出结果并释放内存
    printf("%s\n", result);
    free(result);

    return 0;
}

关键改进点

  • 动态内存分配:根据参数总长度申请足够内存,避免缓冲区溢出。
  • 避开只读内存:将拼接结果存储在自行分配的可写内存中,不直接修改argv内容。
  • 边界检查:处理无参数的异常情况,避免数组越界访问。
  • 内存管理:使用完动态内存后及时释放,防止内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 09:15:48