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

sscanf返回异常结果:char类型变量为何引发输出不符?

问题原因解析

核心问题:类型不匹配触发未定义行为

sscanf的%d格式说明符要求对应参数必须是指向int的指针(int*),但你声明的i是char类型,传递的&i是char*类型,这违反了sscanf的参数规则,直接触发了C语言中的未定义行为——C标准不对这种错误操作的结果做任何保证,程序可能出现任意异常表现。

为什么str会被清空?

在你的场景中,未定义行为具体表现为str内容被覆盖,原因是栈内存溢出:

  • 栈内存通常是向下生长的(后声明的变量分配在更低的内存地址)。假设你的变量栈布局为:i(低地址) → str[20](高地址),二者内存相邻。
  • 当sscanf通过%d往&i写入int类型的12时(32位系统中int占4字节),char类型的i仅能容纳1字节,剩余3字节会向高地址溢出,直接覆盖str的前几个字节(包括str[0])。
  • 12在小端字节序下存储为0x0C 0x00 0x00 0x00,溢出后str[0]被设为0x00(字符串终止符),所以printf输出str时显示为空。

修改为int i后恢复正常的原因

将i声明为int类型后,&i成为标准的int*类型,完全匹配%d的参数要求:

  • sscanf会正确将12写入i的4字节内存空间,不会产生溢出。
  • str的内存未被破坏,因此程序输出符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 13:02:20