对sizeof的思考

一.sizeof的特点(与strlen比较)

1.sizeof是运算符,strlen是函数,这意味着编译程序在编译的时候就把sizeof计算过了,所以sizeof(x)可以用来定义数组维数。

例如

int arr[sizeof(int)];//相当于int arr[4];  

2.sizeof能够返回变量或类型所占的字节空间大小,而strlen只能够返回字符串的大小,即字符串必须以‘\0‘结尾。

char str[20]="0123456789";
int a=strlen(str); //a=10;得到的是字符串的长度
int b=sizeof(str); //而b=20;得到的是数组的长度  

二.sizeof计算不同类型的值的大小

1.变量

sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。

可以按以下几种变量类型分类:

a.对基本数据类型的变量,取得的是数据类型的大小

b.对结构体类型的变量,取得的是结构体变量所占空间的大小。这其中涉及到字节对齐的问题。

c.对数组类型的变量,取得的是数组的大小,并不是数组元素的个数,例如:

int a[3];
sizeof(a)=3*4;而不是等于3.  

d.对指针类型(包括函数指针)的变量,取得的是指针的大小,即4个字节

short f();
printf("%d\n", sizeof(f()));///输出2,  

e.对数组形参,与指针相同返回的是指针的大小,因为c语言中并不传递数组的每个元素值,只是将数组的首地址传给函数。例如

int fun(int a[3])
{.....
sizeof(a)=4;//而不是3*4;
}  

2.基本的数据类型

得到的是基本类型的大小。

三.其他

当适用于一个结构类型时或变量, sizeof 返回实际的大小,当适用于静态的空间数组, sizeof 归还全部数组的尺寸;sizeof 操作符不能返回被动态分派的数组或外部数组的尺寸。

其实理解 sizeof 只需要抓住一个要点:栈

程序存储分布有三个区域:栈、静态和动态。

能够从代码直接操作的对象,包括任何类型的变量、指针,都是在栈上的;动态和静态存储区是靠栈上的所有指针间接操作的。

sizeof 操作符,计算的是对象在栈上的投影体积;记住这个就很多东西都很清楚了。

charconst*static_string="Hello";
//sizeof(static_string)是sizeof一个指针,所以在32bitsystem是4
charstack_string[]="Hello";
//sizeof(stack_string)是sizeof一个数组,所以是6*sizeof(char)
char*string=newchar[6];
strncpy(string,"Hello",6");
//sizeof(string)是sizeof一个指针,所以还是4。
//和第一个不同的是,这个指针指向了动态存储区而不是静态存储区。

不管指针指向的内容在什么地方,sizeof 得到的都是指针的栈大小

C++ 中对引用的处理比较特殊;sizeof 一个引用得到的结果是 sizeof 一个被引用的对象的大小;所以

struct test{
    int a, b, c, d, e, f, g, h;
};
int main(){
    test& r = *newtest;
    cout<<sizeof(test)<<endl;//32
    cout<<sizeofr<<endl;//也是32
}

r 引用的是整个的 test 对象而不是指向 test 的指针,所以 sizeof r 的结果和 sizeof test 完全相同。

时间: 2024-08-24 18:36:14

对sizeof的思考的相关文章

数据结构(C语言版)顺序栈相关算法的代码实现

这两天完成了栈的顺序存储结构的相关算法,包括初始化.压栈.出栈.取栈顶元素.判断栈是否为空.返回栈长度.栈的遍历.清栈.销毁栈.这次的实现过程有两点收获,总结如下: 一.清楚遍历栈的概念 栈的遍历指的是从栈底想栈顶方向运行visit()函数,这是之前的学习中所忽略的:栈的遍历解除了栈的输出顺序只能从栈顶像栈底方向的限制. 二.清空栈时要不要将stacksize重置 网上看到有的人在实现清空栈这一功能时,将stacksize重置为0,我觉得有点问题,起初的想法是将其重置为初始化时的值,在与同学讨论

sizeof函数详解

原文链接http://blog.csdn.net/wzy198852/article/details/7246836 sizeof,一个其貌不扬的家伙,引无数菜鸟竟折腰,小虾我当初也没少犯迷糊,秉着“辛苦我一个,幸福千万人”的伟大思想,我决定将其尽可能详细的总结一下.但当我总结的时候才发现,这个问题既可以简单,又可以复杂,所以本文有的地方并不适合初学者,甚至都没有必要大作文章.但如果你想“知其然,更知其所以然”的话,那么这篇文章对你或许有所帮助.菜鸟我对C++的掌握尚未深入,其中不乏错误,欢迎各

sizeof()详解

1. 定义:sizeof是何方神圣sizeof乃C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数.MSDN上的解释为:The sizeof keyword gives the amount of storage, in bytes, associated with avariable or a type (including aggregate types). This keyword returns a value of type size_

(转)c++类的成员函数存储方式(是否属于类的对象)---一道面试题引发的思考

昨天去面试一家公司,面试题中有一个题,自己没弄清楚,先记录如下: class D { public: void printA() { cout<<"printA"<<endl; } virtual void printB() { cout<<"printB"<<endl; } }; main函数调用: D *d=NULL; d->printA(); d->printB(); 输出结果是? 当时想的是对象d直

关于可变长数组的思考

关于可变长数组的思考  前述: 第一条记: 最近在海纳百川的地铁上,脑海中常想起魏源说过一句话"师夷长技以制夷". 联想最近中国和日本的态度,再联想起自己的人生经历,可以说我是看日本动漫,打日本游戏长大的,到现在看的工具书中绝大部分是老美和日本的.还有一个那就是看金庸和古龙所代表的武侠江湖梦.总结就是,在日本文化我学到了坚强,永不服输.老美的文化给了我探求科学的阶梯.中国的文化给我烙印上了骨气,我一直认为最后着是最重要的.再总结就是"用别人的长处征服别人,用自己的长处统治别人

空暇时候思考2(&amp;#39;\0&amp;#39;等价于数字0还是字符0)

/********************************************************************** * * Copyright (c)2015,WK Studios * * Filename: A.h * * Compiler: GCC vc 6.0 * * Author:WK * * Time: 2015 6 7 * *******************************************************************

空闲时候思考2(&#39;\0&#39;等价于数字0还是字符0)

/********************************************************************** * * Copyright (c)2015,WK Studios * * Filename: A.h * * Compiler: GCC vc 6.0 * * Author:WK * * Time: 2015 6 7 * *******************************************************************

sizeof,终极无惑(上)

0. 前向声明 sizeof,一个其貌不扬的家伙,引无数菜鸟竟折腰,小虾我当初也没少犯迷糊,秉着“辛苦我一个,幸福千万人”的伟大思想,我决定将其尽可能具体的总结一下. 但当我总结的时候才发现,这个问题既能够简单,又能够复杂,所以本文有的地方并不适合刚開始学习的人,甚至都没有必要大作文章.但假设你想“知其然,更知其所以然”的话,那么这篇文章对你也许有所帮助. 菜鸟我对C++的掌握尚未深入,当中不乏错误,欢迎各位扔砖砸蛋. 1. 定义 sizeof是何方神圣?sizeof乃C/C++中的一个操作符(

一个回车符引发的问题思考

在维护和开发通信类软件产品的过程中,经常需要处理一些软件故障问题.在问题刚出现的时候,大家可能显得手足无措,有一种天都要塌下来的感觉.但在问题原因找到之后,大家又会觉得问题原因非常的简单,要是当初开发的时候仔细一点,是不会犯这样的低级错误的.最近,本人就遇到了一个回车符引发的问题. 近日,在开发某软件版本时需要对文件进行操作,在代码中使用了Linux C语言中的opendir函数,但是该函数始终返回NULL,提示文件路径不存在. 本人查了一下该函数的具体情况.opendir函数的原型为: DIR