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
相关产品推荐
相关产品推荐

