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

使用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;
}

关键修复点

  1. 补上char c[]="MON"末尾的分号,修复语法错误,保证变量解析正常。
  2. 将格式字符串修正为%02d%02d%s,让每个参数都有对应的合法格式说明符。
  3. 增加calloc返回值校验,避免使用NULL指针。
  4. 调整snprintf的缓冲区大小参数为14,符合函数要求(参数为缓冲区总字节数,需包含终止符空间)。
  5. 添加free(buffer1),释放动态分配的内存,避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 20:56:14