使用calloc和snprintf时出现访问违规错误,请求代码审查与修复
代码错误分析与修复
问题排查
- 语法错误:
char c[]="MON"末尾遗漏分号,会导致编译器解析混乱,破坏后续变量的内存布局,是引发访问违规的潜在诱因。 - 格式字符串错误:
snprintf的格式串中%02%s是非法格式说明符,第二个整数参数b需要对应%02d,错误的格式符会让snprintf错误处理参数,触发内存访问异常。 - 缺少内存分配检查:
calloc可能分配失败返回NULL,直接使用未校验的指针会引发严重错误。 snprintf参数不合理:原代码传入的缓冲区大小是13,但calloc分配了14字节空间,应该传入缓冲区总大小(包含终止符\0的位置),确保格式化操作安全。
修复后的代码
#include <stdio.h> #include <stdlib.h> int main() { char* buffer1 = calloc(1, 14); // 检查内存分配是否成功 if (buffer1 == NULL) { return 1; } int a = 15; int b = 25; char c[] = "MON"; // 补上遗漏的分号 // 修正格式字符串,匹配所有参数,传入正确的缓冲区大小 int k = snprintf(buffer1, 14, "%02d%02d%s", a, b, c); // 可选:验证格式化结果 printf("格式化内容:%s\n", buffer1); printf("写入字符数:%d\n", k); free(buffer1); // 释放calloc分配的内存,避免泄漏 return 0; }
关键修复点
- 补上
char c[]="MON"末尾的分号,修复语法错误,保证变量解析正常。 - 将格式字符串修正为
%02d%02d%s,让每个参数都有对应的合法格式说明符。 - 增加
calloc返回值校验,避免使用NULL指针。 - 调整
snprintf的缓冲区大小参数为14,符合函数要求(参数为缓冲区总字节数,需包含终止符空间)。 - 添加
free(buffer1),释放动态分配的内存,避免内存泄漏。
内容的提问来源于stack exchange,提问作者geek
相关产品推荐
相关产品推荐

