使用scanf_s读取字符串触发Access Violation异常求助
问题排查与解决方案
核心错误原因
程序崩溃的直接原因是scanf_s的参数使用错误,导致写入非法内存区域:
- 参数类型不匹配:
string作为字符数组名,本身就代表数组首元素的地址(char*类型),但你传递了&string——这是指向整个数组的指针(char(*)[100]类型)。scanf_s会将这个错误地址当作字符串缓冲区起始位置写入,直接触发0xC0000005内存访问违规。 - 缺少安全长度参数:
scanf_s是微软实现的安全输入函数,使用%s格式符时必须额外指定缓冲区的最大容量(包含终止符\0),否则行为未定义,也可能引发内存问题。 - 格式串冗余空格:
" %s "中的尾部空格会让scanf_s在读取输入后继续等待非空白字符,干扰正常交互逻辑。
修正后的代码
#include <stdio.h> int main() { char string[100]; printf("Enter a string: "); // 传递正确的缓冲区地址,并指定缓冲区大小 scanf_s("%s", string, (unsigned)_countof(string)); printf("You entered: %s\n", string); return 0; }
修正说明
- 移除
&符号:直接使用string传递缓冲区首地址,类型完全匹配scanf_s的%s要求。 - 添加缓冲区长度参数:
(unsigned)_countof(string)会自动计算数组元素个数(此处为100),告诉scanf_s最多写入99个字符(预留1个位置给字符串终止符\0),从根源避免缓冲区溢出。如果不想用_countof,也可以直接写100。 - 调整格式串:将
" %s "改为"%s",消除不必要的输入等待;同时优化printf输出格式,让结果更清晰易读。
内容的提问来源于stack exchange,提问作者0xNessy
相关产品推荐
相关产品推荐

