<s>scanf在读入时到底发生了什么</s>
<s>引用 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 类型的地址 这样有没有问题？</s><s>有问题， 只是未必显现出来。</s><s>windows当中， int是4个字节， 低位字节在前，高位字节在后 因此读入一个整数的时候， 如果不超过255那么，它所占据的有效地址就是char所在的空间， 超出的时候才占据了更高地址的空间 为测试这点， 你定义一个char c【4】这样的数组， scanf（“%d”， c）； 这样，你输入不同的数，然后看c【0】～c【4】内容的变化就可以验证这一点。</s><s>你的代码可以运行，并感觉没错，那恐怕只是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的空间。</s><s>） 或者用前面给的那个union结构体， 看看同一空间下，不同的数值变化，就知道内存占据的情况了例子不好 char str[sizeof (int)] = ""; 然后 scanf %d str 可以明确看到操作结果</s>
