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

