关闭

C语言中的 sizeof 问题

标签: 语言c编译器ubuntu
1233人阅读 评论(1) 收藏 举报
分类:

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


#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语言没有那么简单,十年磨一剑!大家加油!


3
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

常问面试题:C++中sizeof的陷阱及应答

http://blog.csdn.net/lanxuezaipiao/article/details/19013833 C++中sizeof是经常被问到的一个概念,比如,下面的几个关于sizeof的面试题反复出现在各大IT公司的技术面试当中,我们有必要完全理解并掌握。 注:在曾经面试...
  • xtzmm1215
  • xtzmm1215
  • 2015-03-11 19:24
  • 1195

C++类的大小——sizeof(class)

第一:孔磊d class CBase { }; 运行cout sizeof(CBase)=1; 为什么空的什么都没有是1呢?查资料……查啊查……OK这里了:先了解一个概念:类的实例化,所谓类的实例化就是在内存中分配一块地址,每个实例在内存中都有独一无二的地址。同样空类也会被实例化(...
  • yangyangye
  • yangyangye
  • 2014-08-03 22:06
  • 6111

C/C++介绍sizeof函数

0. 前向声明 sizeof,一个其貌不扬的家伙,引无数菜鸟竟折腰,小虾我当初也没少犯迷糊,秉着“辛苦我一个,幸福千万人”的伟大思想,我决定将其尽可能详细的总结一下。 但当我总结的时候才发现,这个问题既可以简单,又可以复杂,所以本文有的地方并不适合初学者,甚至都没有必要大作文章。但如果你...
  • lj695242104
  • lj695242104
  • 2013-11-17 19:55
  • 4017

sizeof运算符详细总结

sizeof运算符的系统总结标签:c/c++转自 http://blog.csdn.net/w57w57w57/article/details/6626840 简介   sizeof是C/C++中的关键字,它是一个运算符,其作用是取得一个对象(数据类型或者数据对象)的长度(即占用内存的大小,以byt...
  • hust_sheng
  • hust_sheng
  • 2016-01-18 16:36
  • 2379

sizeof和sizeof的问题

关于sizeof(string),今天看那本面试宝典的时候看到这个表达式,有点吃惊,书上写着sizeof(string)=4;当时很纳闷,难道分配4个字节大小的内存给string吗?查阅了相关资料得出结论:string的实现在各库中可能有所不同,但是在同一库中相同一点是,无论你的string里放多长...
  • zhengfushijie
  • zhengfushijie
  • 2014-10-22 11:12
  • 163

sizeof对字符数组字符串使用

#include using namespace std; void main() { char a[]={'a','b','c'}; //不是以字符串形式初始化,因此没有添加/0标志 char b[]={"abc"...
  • u010630958
  • u010630958
  • 2014-07-17 09:02
  • 669

sizeof及常见考题

sizeof是C/C++中的关键字,它是一个运算符,其作用是取得一个对象(数据类型或者数据对象)的长度(即占用内存的大小,以byte为单位)。 在C++中,变量和自定义类型可以不用加(),内置类型要加。 需要注意的点包括: 1)它是运算符,不是函数; 2)sizeof不能求得...
  • myself00
  • myself00
  • 2014-10-27 21:06
  • 614

sizeof(string)的问题(很经典)

今天看到一个代码,刚开始没有看明白,代码如下: #include #include using namespace std; void main() { string a="www.ok2002.com"; string b=" study C++ program&qu...
  • u014082714
  • u014082714
  • 2015-04-28 12:57
  • 3289

sizeof浅析(三)——求类的大小

sizeof求类的大小和求结构体的大小,有一定的相似性,但又不完全相同,因为类存在这继承和派生、存在着虚函数。 1、空类大小 对于一个空类,使用sizeof求得其大小为1。 2、简单类 如下定义一个类, class A { public: int a; private: char b...
  • szchtx
  • szchtx
  • 2013-08-24 11:22
  • 5719

浅析C++中sizeof操作符的用法

1. 概要 sizeof是C/C++中的一个操作符(operator),作用就是返回一个对象或者类型所占的内存字节数。返回值类型为size_t,在头文件stddef.h中定义.这是一个依赖于编译系统的值,一般定义为typedef unsigned int size_t;编译器林林总总,但作为一个规...
  • wangshubo1989
  • wangshubo1989
  • 2015-08-31 11:27
  • 1953
    个人资料
    • 访问:618933次
    • 积分:7009
    • 等级:
    • 排名:第3817名
    • 原创:182篇
    • 转载:36篇
    • 译文:0篇
    • 评论:84条
    博客专栏