请判断以下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
相关产品推荐
相关产品推荐

