为什么这段调用sprintf_s的C语言代码会抛出访问异常?
问题原因
你使用的安全版本字符串格式化函数sprintf_s的传参方式不符合要求:
- 微软实现及C标准Annex K定义的
sprintf_s,和传统sprintf的参数列表不同,当第一个参数为目标缓冲区指针时,必须在格式字符串之前传入缓冲区的最大可用长度作为第二个参数。 - 你当前的调用漏传了缓冲区长度参数,导致函数参数解析完全错位:将格式字符串
"%s"的地址识别为缓冲区长度,将filePrefix识别为格式字符串,后续内部内存访问逻辑完全错乱,最终触发0xC0000005写入访问违例异常。
修复方案
补上缓冲区长度参数即可,示例如下:
char filePrefix[] = "test"; char fileName[100]; fileName[0] = 0; // 第二个参数传入缓冲区总大小 sprintf_s(fileName, sizeof(fileName), "%s", filePrefix);
内容的提问来源于stack exchange,提问作者nicomp
相关产品推荐
相关产品推荐

