scanf 在 读入 时 到底 发生 了 什么
引用 2 楼 寻 开心 的 回复 : 你 这样 看 不 出来 问题 ， 做 测试 就 要 做成 能 发现 问题 的 union M { long long int ll ; int n [ 2 ] ; short s [ 4 ] ; char c [ 8 ] } u ; 做成 这样 的 一 个 联合体 ， 然后 你 再 测试 你 的 代码 去 先 说 我 认为 的 答案 scanf 第一 个 字符 串 指定 了 后面 的 内容 的 格式 ， 第二 个 开始 起 ， 都 是 一 个 一 个 的 内存 地址 按照 指定 的 格式 ， 把 读入 数据 放到 指定 的 内存 当中 去 ， 在 这个 过程 当中 并 没有 做 内存 地址 的 安全性 检测 ， 是 假定 你 给 的 地址 都 是 对 的 你 指定 要 读 入 一 个 long int （ windows 下 long int 和 int 都 是 32 位 的 ） ， 但是 你 传递 给 他 的 是 一 个 char 类型 的 地址 这样 有 没有 问题 ？ 有 问题 ， 只是 未必 显现 出来 。 windows 当中 ， int 是 4 个 字节 ， 低位 字节 在 前 ， 高位 字节 在 后 因此 读 入 一 个 整数 的 时候 ， 如果 不 超过 255 那么 ， 它 所 占据 的 有效 地址 就 是 char 所在 的 空间 ， 超出 的 时候 才 占据 了 更 高 地址 的 空间 为 测试 这 点 ， 你 定义 一 个 char c 【 4 】 这样 的 数 组 ， scanf （ “ % d ” ， c ） ； 这样 ， 你 输入 不同 的 数 ， 然后 看 c 【 0 】 ～ c 【 4 】 内容 的 变化 就 可以 验证 这 一点 。 你 的 代码 可以 运行 ， 并 感觉 没错 ， 那 恐怕 只是 scanf 读取 的 数据 所 破坏 掉 的 内存 空间 ， 并 没有 被 使用 ， 效果 没有 显现 出来 而已 char a = 0 ； char b = 0 ; char c = 0 ; char d = 0 ; scanf ( " % d " , & b ) ; 你 输入 65535 ， 然后 看 看 c 和 a 的 值 是否 发生 变化 了 （ 具体 是 a 还是 c 变 了 ， 取决于 编译 器 ， 大部分 编译 器 会 把 栈 地址 做成 向 下 增长 ， 也 就 是 b 的 地址 比 a 的 地址 低 ， 所以 b 存放 int 的 时候 ， 必然 向上 增长 覆盖 a 的 空间 。 ） 或者 用 前面 给 的 那个 union 结构体 ， 看 看 同 一 空间 下 ， 不同 的 数值 变化 ， 就 知道 内存 占据 的 情况 了 例子 不 好 char str [ sizeof ( int ) ] = " " ; 然后 scanf % d str 可以 明确 看到 操作 结果
