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

snprintf触发段错误问题排查及动态分配修复方案

结构体字符串成员段错误问题排查与解决

无法在极简测试文件中复现该问题,仅在大型项目中出现,单独提取相关函数运行无异常。

项目结构体定义

typedef struct {
    uint32_t x, y;
    uint16_t w, h;
    char* str;
} Text;

typedef struct {
    uint32_t last_tick;
    uint32_t delta_ms;
    float delta;
    float t_fps;
    uint16_t fps;
} Clock;

问题场景

在Other结构体的初始化函数中,将其text_frame_rate成员初始化为:

other->text_frame_rate = (Text){ 0,0,0,0, (char[8]){} };

该成员用于存储"FPS: 60"这类格式的文本。随后在_render_frame_rate函数中调用snprintf写入内容时触发段错误:

void _render_frame_rate(Other* other, Clock clock)
{
    snprintf(other->text_frame_rate.str, 8, "FPS: %d", clock->fps);

    ...
}

注:该函数由Render_game(参数为SDL_Renderer* renderer, Other* other, Clock* clock)调用。

临时修复方式

仅当在_render_frame_rate中重新初始化text_frame_rate后,程序可正常运行:

void _render_frame_rate(Other* other, Clock clock)
{
    other->text_frame_rate = (Text){ 0,0,0,0, (char[8]){} }; // 重新初始化后无问题

    snprintf(other->text_frame_rate.str, 8, "FPS: %d", clock->fps);

    ...
}

问题排查细节

通过printf检查发现,初始化和调用时text_frame_rate.str的指针地址一致,且该变量未被其他代码修改。

最终解决方案

在@IanAbbott的提示下,通过动态分配内存解决问题:

other->text_frame_rate = (Text){ 0,0,0,0, NULL };
other->text_frame_rate.str = malloc(8);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 18:01:14