C语言里的sizeof关键字用于返回变量的类型宽度(变量所占的字节个数)。例如:

#include <stdio.h>

int main() {

int i = 0;

int size = sizeof i;

printf("size of i is: %d",size);

return 0;

}

会在控制台打印出int类型的变量i在内存中所占的字节的个数。我机器上的执行结果是:

size of i is: 4

从上面这个例子看,sizeof蛮好用的,同时你可能觉得以后你需要知道类型宽度的时候,你也不会用错。但是你想得太简单了,sizeof是有坑的,你很可能栽进去也不知道,程序有问题找不出来。

下面看看sizeof到底有什么坑爹的地方。

先举个例子,看看下面的程序的执行结果是什么?

#include <stdio.h>

int get_sizeof(char a[]) {

return sizeof a;

}

int main() {

int size = -1;

char a[] = "123456789"

size = sizeof a;

printf("size of a is: %d\n",size);

size = get_sizeof(a);

printf("size of a is: %d\n",size);

return 0;

}

估计出乎你的意料,执行结果竟然是:

size of a is: 10

size of a is: 4

为什么同样是使用sizeof运算符,只不过一个直接使用,另一个通过函数包装了一下,为什么结果就不一样了呢?

别怀疑编译器,编译器没错,这最多算是比较坑爹,原因很简单,在调用get_sizeof函数的时候,函数内部把参数a作为一个指针对待,而指针在内存中占4个字节的长度。对于函数内部声明的字符数组变量,它才会把它作为一个字符数组对待。

所以返回的是4。这里建议你不要抬杠,C语言就是这样的,它的规矩就是这么定的,说什么也没有用。除非哪一天你下定决心不再用C语言,这个折磨人的事情你就不用再承受。

总结起来是这样的,你死死记住就行了,别太深究:

当对一个字符数组变量做sizeof运算的时候,分为以下两种情况:

1、当这个变量是作为参数传入函数内部的话,C语言会认为这只是一个指针变量,做sizeof运算返回的将是一个指针在内存中所占的字节数。

2、其他情况,这时C语言会把该变量当成一个字符数组,做sizeof运算返回的将是字符数组的长度(包括\0在内)。

坑爹系列:sizeof运算符的更多相关文章

  1. Sizeof运算符小结

    以下内容援引自<C Primer Plus>中文版第五版Page95 Sizeof运算符以字节为单位返回其操作数的大小.(在C中,1个字节被定义为char类型所占用空间的大小.在过去,1个 ...

  2. sizeof运算符和strlen函数的区别

    1.sizeof是运算符,而strlen是函数. 2.sizeof操作符的运算结果为size_t,他在头文件中的typedef为unsigned int.该类型保证能容纳所操作对象的最大字节大小. 3 ...

  3. sizeof运算符来获取各种数据类型在内存中所占字节数--gyy整理

    C++并没有规定各种数据类型在内存中的存储大小,依赖于不同的编译器的不同而不同,要想获知当前编译器对各种数据类型分配的大小,可以通过sizeof运算符来获取. 使用方法1: sizeof(数据类型) ...

  4. sizeof运算符

    sizeof运算符返回一条表达式或一个类型名字所占的字节数.sizeof运算符满足右结合律,其所得的值是一个size_t类型的常量表达式.运算符的运算对象有两种形式: sizeof(type) siz ...

  5. C++ Prime:sizeof运算符

    sizeof运算符的结果部分地依赖于其作用的类型: 对char或者类型为char的表达式执行sizeof运算结果得1: 对引用类型执行sizeof运算得到被引用对象所占空间的大小: 对指针执行size ...

  6. C语言之字符集、ASCII码和sizeof运算符

    一 字符集和ASCII码 结论:字符本质上也是一个整数,每个字符都有唯一一个与之对应的整数, 比如说小写的a对应97,b对应98,c对应99,大写的A对应65,B对应66,C对应67 所以字符对应的那 ...

  7. C++ 之sizeof运算符

    sizeof运算符用来计算某个对象在内存中占用的字节数. 此运算符的使用形式为:sizeof(类型名)或sizeof(表达式). 计算结果是这个类型或者这个表达式结果在内存中占的字节数.

  8. 【原创】sizeof运算符总结

    sizeof运算符返回一条表达式或一个类型名字的所占字节数,返回值为size_t的常量表达式,注意:sizeof右结合,且为编译时计算,而非运行时 两种形式:sizeof (type)和sizeof ...

  9. 深入理解类成员函数的调用规则(理解成员函数的内存为什么不会反映在sizeof运算符上、类的静态绑定与动态绑定、虚函数表)

    本文转载自:http://blog.51cto.com/9291927/2148695 总结: 一.成员函数的内存为什么不会反映在sizeof运算符上?             成员函数可以被看作是类 ...

随机推荐

  1. iOS开发——设备篇Swift篇&判断设备类型

    判断设备类型   1,分割视图控制器(UISplitViewController) 在iPhone应用中,使用导航控制器由上一层界面进入下一层界面. 但iPad屏幕较大,通常使用SplitViewCo ...

  2. 小米2在Eclipse 调试,要注意下列步骤。

    小米2在Eclipse 调试,要注意下列步骤.1.连接线,打开设置:USB线连接小米2,在设置-->开发者选项->USB 调是打开.如果这一步,就业在Eclipse中真机调试,下面的步骤不 ...

  3. 初探Linux进程管理机制

    转至:http://ixdba.blog.51cto.com/2895551/543737 一 .进程的概念和分类1.进程的概念 Linux是一个多用户多任务的操作系统.多用户是指多个用户可以在同一时 ...

  4. 【ZZ】MySql语句大全:创建、授权、查询、修改等

    http://blog.csdn.net/evankaka/article/details/45580845

  5. c#智能感知(设置)及实现

    1) 使用工具->选项菜单命令,选择文本编辑器->C#设置, 将上面圈出的2个复选框(自动列出成员和参数信息)打勾, 然后 Intellisense就会工作了.(如果没这么多选项,请勾选S ...

  6. HBase-java api 基本操作

    使用的是完全分布式,详细信息为: 操作的Java 代码(抄的别人的) package org.admln.hbase; import java.util.ArrayList; import java. ...

  7. Steps to disable DRLs with GM Tech2 scanner

    It is possible to get daytime running time disabled manually. But the problem can be easily settled ...

  8. JMX笔记(一)

    上篇 JMX初体验 使用HtmlAdaptorServer提供的界面实现了调用MBean,除此之外,还可以使用rmi方式连接调用MBeanServer 要连接,自然要有url:service:jmx: ...

  9. Redis中文显示为Unicode编码的解决办法

    通过Xshell远程连接Linux中的Redis数据库.... 存入Reids中的value有中文. Xshell得到之后中文并不显示为乱码,显示的是中文对应的Unicode编码: 在Xshell中字 ...

  10. insert 另外一种用法

    then into dept01(id) values(deptno) then into dept02(id) values(deptno) else into dept03(id) values( ...