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

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

修正说明

  1. 移除&符号:直接使用string传递缓冲区首地址,类型完全匹配scanf_s的%s要求。
  2. 添加缓冲区长度参数:(unsigned)_countof(string)会自动计算数组元素个数(此处为100),告诉scanf_s最多写入99个字符(预留1个位置给字符串终止符\0),从根源避免缓冲区溢出。如果不想用_countof,也可以直接写100。
  3. 调整格式串:将" %s "改为"%s",消除不必要的输入等待;同时优化printf输出格式,让结果更清晰易读。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 00:01:09