为方便了解背景,如下图所示,为从《C缺陷和陷阱》书上截下的图片:
为了研究下这个问题,在code blocks上演示了下:
代码如下
#include <stdio.h> #include <stdlib.h> int main() { // printf("Hello world!\n"); int i; char c; for(i=0;i<5;i++){ scanf("%d",&c); printf("%d ",i); } printf("\n"); return 0; }
然后编译,运行,结果却是如下图:
结果并不像书中所述的结果: 0 0 0 0 0 1 2 3 4
也许是编译器的事,这里暂时不管。
当时准备想接着往下看的,这里,我停了一下,想研究一下:
发现涉及到的问题还挺多的。
1. 大小端问题。
2. int和char数据类型的大小(其实是操作系统的位数问题)
所以我重新修改代码如下:
#include <stdio.h> #include <stdlib.h> int main() { // printf("Hello world!\n"); int i; char c; printf("%d-%d\n",sizeof(int), sizeof(char)); for(i=0;i<5;i++){ scanf("%d",&c); printf("%d ",i); } printf("\n"); return 0; }
再次编译,运行,如下:
如果输入不是0到4,会出现如下情况:
代码如下:(为了便于观看结果我在第一个printf后面加了个\n)
#include <stdio.h> #include <stdlib.h> int main() { // printf("Hello world!\n"); int i; char c; printf("%d-%d\n",sizeof(int), sizeof(char)); for(i=0;i<5;i++){ scanf("%d",&c); printf("%d \n",i); } printf("\n"); return 0; }
运行,输入些数据,如下图:
重新输入如下图:
让我们重新分析下程序,虽然很小,但是仔细分析,还是有很多知识点在里面。
因为sizeof(int)=4, sizeof(char)=1
又因为局部变量存储在栈区,同时栈是向下生长(堆是向上生长,另提)
于是就有了,下面的图示:
当先分配i的时候,它占用4个字节,如图中ABCD四个部分,当输入c的时候,分配了4个字节,根据些x86小端存储原理,c要占用EDCB四个部分。
所以当输入小于1个字节时,都没有问题,当大于一个字节是就会覆盖掉i的低字节部分。
所以就出现了上述的几个结果.
聪明的你,看懂了吗?