由《C缺陷和陷阱》上的一个例子想到的

 

为方便了解背景,如下图所示,为从《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的低字节部分。

所以就出现了上述的几个结果.

聪明的你,看懂了吗?

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值