C语言中的 sizeof 问题

原创 2012年03月21日 14:10:05

        今天有同学问一串代码,不知道为什么是那样的输出,话不多说,先看代码:


#include <stdio.h>
#define NUM (sizeof(arr) / sizeof(arr[0]))

int arr[] = { 1, 2, 3, 4, 5, 6, 7 };

int main()
{
    int i;
 
    for( i = -1; i <= ( NUM - 2 ); i++)
    {     
   	printf("%d\n",arr[i+1]);
    }
    
    return 0;
}

输出的结果是什么呢?自己看看,是不是很“恶心”,很出乎意料!?

竟然是空的!

其实,不是空的才不正常呢!

那么我们就需要知道 sizeof 的实现原理!

我们要知道的是:sizeof返回的是一个unsinged int的值!那么在for循环的时候,i = -1就会向后面转型,将其值转化为sizeof的值,那么我们很清楚,-1转化的sizeof的值是很大的一个正整数!那么很显然就直接不符合i <= ( NUM - 2 )的条件了,所以就不会输出!!!


那么sizeof还有另一个问题:

看下面代码:

#include <stdio.h>
int main()
{
    int i;
    i = 10;

    printf("i : %d\n",i);
    printf("sizeof(i++) is: %d\n",sizeof(i++));
    printf("i : %d\n",i);

    return 0;
}

知道结果是什么吗?

结果在我的机子上的运行:

pt@ubuntu:~/桌面/C语言中好玩的东东$ ./c

 i : 10
 sizeof(i++) is: 4
 i : 10

为什么第三个还是输出10呢?!


解释:

        解决这个问题就是要理解编译器编译原理
        我们要知道sizeof仅仅是一个操作符而已
        并不是函数,sizeof要做的仅仅是获得
        i++的字节数,那么所以在编译的时候
        就直接用4代替了i++了,反正编译器知道
        结果都是一样,所以最终i++并没有执行!


还有什么更好的想法,欢迎大家共勉,呵呵呵~


所以我们知道,其实C语言没有那么简单,十年磨一剑!大家加油!


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

C语言sizeof求结构体大小问题汇总

可以说一直被各类结构体大小问题说困扰,花了大半天时间查了一下资料,现在整理汇总一下。 sizeof:C语言中判断数据类型或者表达式长度符;不是一个函数,字节数的计算在程序编译时进行,而不是在程序执行的...

C语言中sizeof用法中关于边界对齐的问题

本文主要包括二个部分,第一部分重点介绍在VC中,怎么样采用sizeof来求结构的大小,以及容易出现的问题,并给出解决问题的方法,第二部分总结出VC中sizeof的主要用法。 1、sizeof应用在结...

解析C语言中的sizeof.docx

  • 2012年09月03日 14:29
  • 26KB
  • 下载

详细解析C语言中的sizeof

  • 2012年01月13日 19:43
  • 46KB
  • 下载

C语言 sizeof函数详解

sizeof,一个其貌不扬的家伙,引无数菜鸟竟折腰,小虾我当初也没少犯迷糊,秉着“ 辛苦我一个,幸福千万人”的伟大思想,我决定将其尽可能详细的总结一下。 但当我总结的时候才发现,这个问题既可以简单...

解析C语言中的sizeof.rar

  • 2007年11月27日 15:52
  • 2KB
  • 下载

C语言笔记:变量字节长度&取值范围——sizeof()VS strlen

sizeof():是运算符(operator),其作用就是返回一个对象或者类型所占的内存字节数。可用于任何变量名、类型名或常量值,当用于变量名(不是数组名)或常量时,它不需要用圆括号。C规定sizeo...

C语言中 sizeof 运算的值是在编译时还是运行时确定的?

在经典的《C语言程序设计》书中说到: C语言提供了一个编译时(compile-time) 一元运算符 sizeof,它可以用来计算任一对象的长度。 表达式 sizeof 对象 以及 siz...

c语言sizeof求结构体的大小

运算符sizeof可以计算出给定类型的大小,对于32位系统来说,sizeof(char) = 1; sizeof(int) = 4。基本数据类型的大小很好计算,我们来看一下如何计算构造数据类型的大小。...

C语言中sizeof求结构体大小(让你真正了解结构体成员在内存中的分布情况)

今天我在写程序的时候我发现当一个结构体里面的成员变量相同的时候但是顺序不同的时候,所消耗的内存大小是不一样的, 因为我对内存的消耗很敏感,我想它具体是怎么用的 ,于是我具体看了下关于结构体成员在内存...
  • yyfwd
  • yyfwd
  • 2016年03月14日 15:50
  • 1998
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言中的 sizeof 问题
举报原因:
原因补充:

(最多只允许输入30个字)