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

请判断以下C语言代码是否正确?并给出修复方案

代码问题分析与修复

这段C语言代码存在两个关键问题:

1. 语法错误

strcat(file_name, ".pcap") 语句末尾缺少分号,会直接导致编译失败。

2. 缓冲区溢出(严重逻辑错误)

strdup(base) 仅分配了能容纳 base 字符串(含终止符)的内存空间,但后续用 strcat 追加 ".pcap" 时,没有额外内存容纳新增字符,这会触发未定义行为(通常是缓冲区溢出,可能导致程序崩溃或内存损坏)。


修复后的代码

方法一:手动计算内存大小并分配

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

char *make_file_name(char *base)
{
    // 处理base为NULL的边界情况
    if (base == NULL) {
        return NULL;
    }

    const char *suffix = ".pcap";
    size_t total_len = strlen(base) + strlen(suffix) + 1; // +1 用于存储字符串终止符
    char *file_name = malloc(total_len);

    if (file_name == NULL) {
        return NULL; // 内存分配失败时返回NULL,交由调用方处理
    }

    strcpy(file_name, base);
    strcat(file_name, suffix);
    return file_name;
}

方法二:使用asprintf(GNU扩展,更简洁)

如果编译环境支持GNU扩展(比如GCC),可以用asprintf自动处理内存分配:

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

char *make_file_name(char *base)
{
    if (base == NULL) {
        return NULL;
    }

    char *file_name = NULL;
    // asprintf会自动分配足够内存,成功返回字符串长度,失败返回-1
    if (asprintf(&file_name, "%s.pcap", base) == -1) {
        return NULL;
    }
    return file_name;
}

额外注意事项

  • 调用make_file_name的代码需要负责用free()释放返回的内存,避免内存泄漏。
  • 修复后的代码都处理了base为NULL和内存分配失败的边界情况,提升了鲁棒性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 16:00:29