sizeof使用方法--重要!!

原创 2005年06月01日 20:46:00

自己的话:

sizeofint)等的大小依赖于操作系统的位数,如果是在16DOS环境下,用TC编译,则为2,如果在windows环境下,用VC编译,则为4

第一个例子:

char* ss = "0123456789";

sizeof(ss) 结果 4 ===》它反映了操作系统的位数,windows32位的。但是如果在16DOS环境下,用TC编译,结果是2

sizeof(*ss) 结果 1 ===》*ss是第一个字符

 

char ss[] = "0123456789";

sizeof(ss) 结果 11 ===》数组长度,计算到/0位置,因此是101

sizeof(*ss) 结果 1 ===》*ss是第一个字符

 

char ss[100] = "0123456789";

sizeof(ss) 结果是100 ===》ss表示数组在内存中的大小 100×1

strlen(ss) 结果是10 ===》strlen是个函数内部实现是用一个循环计算到/0为止之前

 

int ss[100] = "0123456789";

sizeof(ss) 结果 400 ===》ss表示数组在内存中的大小 100×4,但是如果在16DOS环境下,用TC编译程序,结果是200,因为int大小是2100×2

strlen(ss) 错误 ===》strlen的参数只能是char* 且必须是以''/0''结尾的

 

char q[]="abc";

char p[]="a/n";        // /n算一个字符

sizeof(q),sizeof(p),strlen(q),strlen(p);

结果是 4 3 3 2     

 

第二个例子:

class X

{

int i;

int j;

char k;

};

X x;

cout<<sizeof(X)<<endl; 结果 12 ===》内存补齐

cout<<sizeof(x)<<endl; 结果 12 同上

 

 

第三个例子:

char szPath[MAX_PATH]

  如果在函数内这样定义,那么sizeof(szPath)将会是MAX_PATH,但是将szPath作为虚参声明时(void fun(char szPath[MAX_PATH]),sizeof(szPath)却会是4(指针大小)

三、sizeof深入理解。

  • 1.sizeof操作符的结果类型是size_t,它在头文件中typedefunsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。

  • 2.sizeof是算符,strlen是函数。

  • 3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''/0''结尾的。sizeof还可以用函数做参数,比如:

·                short f();

·                printf("%d/n", sizeof(f()));

输出的结果是sizeof(short),即2

  • 4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。

  • 5.大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因

·                char str[20]="0123456789";

·                int a=strlen(str); //a=10;

·                int b=sizeof(str); //b=20;

  • 6.strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,不是类型占内存的大小。

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

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

  • 9.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,如:

·                fun(char [8])

·                fun(char [])

都等价于 fun(char *) C++里传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小如果想在函数内知道数组的大小, 需要这样做:进入函数后用memcpy拷贝出来,长度由另一个形参传进去

fun(unsiged char *p1, int len)

{

  unsigned char* buf = new unsigned char[len+1]

  memcpy(buf, p1, len);

}

有关内容见: C++ PRIMER?

  • 10.计算结构变量的大小就必须讨论数据对齐问题。为了CPU存取的速度最快(这同CPU取数操作有关,详细的介绍可以参考一些计算机原理方面的书),C++在处理数据时经常把结构变量中的成员的大小按照48的倍数计算,这就叫数据对齐(data alignment)。这样做可能会浪费一些内存,但理论上速度快了。当然这样的设置会在读写一些别的应用程序生成的数据文件或交换数据时带来不便。MS VC++中的对齐设定,有时候sizeof得到的与实际不等。一般在VC++中加上#pragma pack(n)的设定即可.或者如果要按字节存储,而不进行数据对齐,可以在Options对话框中修改Advanced compiler页中的Data alignment为按字节对齐。

  • 11.sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。如sizeof(max)若此时变量max定义为int max(),sizeof(char_v) 若此时char_v定义为char char_v [MAX]MAX未知,sizeof(void)都不是正确形式

四、结束语

sizeof
使用场合。

  • 1.sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。例如: 

·                  void *mallocsize_t size, 

·                  size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)

  • 2.用它可以看看一类型的对象在内存中所占的单元字节。

·                void * memsetvoid * s,int c,sizeof(s)

  • 3.在动态分配一对象时,可以让系统知道要分配多少内存。

  • 4.便于一些类型的扩充,windows中就有很多结构内型就有一个专用的字段是用来放该类型的字节大小。

  • 5.由于操作数的字节数在实现时可能出现变化,建议在涉及到操作数字节大小时用sizeof来代替常量计算。

  • 6.如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。

  •  

[C++]C++应聘笔试..常考的sizeof()
nathan
发表于 2004-11-16 16:51:00

sizeof()   是一个操作符...注意不是个函数,方法.是用来返回基本数据长度的

如果sizeof()用在数组上..就返回数组的长度

char *p="world";

cout<<sizeof(p)<<endl;

输出是4  ,可见是把指针的长度返回了.

char *p="world";

cout<<sizeof(*p)<<endl;

输出1  ,char的长度返回了

 char p[]="world";  
 cout<<sizeof(p)<<endl;

输出6,  返回了动态数组的长度..world 5,"/0" 是字符串结尾符..1...所以返回6

cout<<sizeof(char)<<endl:     re: 1

cout<<sizeof(int)<<endl:     re: 4

cout<<sizeof(float)<<endl:     re: 4

cout<<sizeof(double)<<endl:     re: 8

 

 

 

解析C语言中的sizeof

作者:unknown 更新时间: 2005-03-14

 

 


一、sizeof的概念

   sizeofC语言的一种单目操作符,如C语言的其他操作符++--等。它并不是函数。sizeof操作符以字节形式给出
了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。



二、sizeof的使用方法

   1、用于数据类型

   sizeof使用形式:sizeoftype

   数据类型必须用括号括住。如sizeofint)。

  

 2、用于变量

   sizeof使用形式:sizeofvar_name)或sizeof var_name

   变量名可以不用括号括住。如sizeof (var_name)sizeof var_name等都是正确形式。带括号的用法更普遍,大多数程序员采用这种形式。

   注意:sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。

   如sizeof(max)若此时变量max定义为int max(),sizeof(char_v) 若此时char_v定义为char char_v [MAX]MAX未知,
sizeof(void)
都不是正确形式。



三、sizeof的结果

   sizeof操作符的结果类型是size_t,它在头文件中typedefunsigned int类型。该类型保证能容纳实现所建立的最
大对象的字节大小。

   1、若操作数具有类型charunsigned charsigned char,其结果等于1

   ANSI C正式规定字符类型为1字节。

   2intunsigned int short intunsigned short long int unsigned long floatdoublelong double
类型的sizeof ANSI C中没有具体规定,大小依赖于实现,一般可能分别为2222444810

   3、当操作数是指针时,sizeof依赖于编译器。例如Microsoft C/C++7.0中,near类指针字节数为2farhuge类指针字节数为4。一般Unix的指针字节数为4

   4、当操作数具有数组类型时,其结果是数组的总字节数。

   5、联合类型操作数的sizeof是其最大字节成员的字节数。结构类型操作数的sizeof是这种类型对象的总字节数,包括
任何垫补在内。

   让我们看如下结构:

   struct {char b; double x;} a;

   在某些机器上sizeofa=12,而一般sizeofchar+ sizeofdouble=9

   这是因为编译器在考虑对齐问题时,在结构中插入空位以控制各成员对象的地址对齐。如double类型的结构成员x要放
在被4整除的地址。

   6、如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。



四、sizeof与其他操作符的关系

   sizeof的优先级为2级,比/%3级运算符优先级高。它可以与其他操作符一起组成表达式。如i*sizeofint);其
iint类型变量。



五、sizeof的主要用途

   1sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。例如:

   void *mallocsize_t size,

   size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)

   2sizeof的另一个的主要用途是计算数组中元素的个数。例如:

   void * memsetvoid * s,int c,sizeof(s))。



六、建议

   由于操作数的字节数在实现时可能出现变化,建议在涉及到操作数字节大小时用ziseof来代替常量计算。

 

object-c中管理文件和目录:NSFileManager使用方法

对于NSFileManager,文件或目录是使用文件的路径名唯一标识的。每一个路径名都是一个NSString对象,它可以是相对路径名,也可以是完整路径名。 相对路径名是相对于当前目录的路径名。所以,...
  • enuola
  • enuola
  • 2012年07月28日 11:39
  • 8064

linux常用命令-find和grep区别及使用方法

find和grep区别 find用法详解 grep用法详解

Swift学习-枚举(Enumerations)的使用方法

Swift学习-枚举的使用方法 枚举的使用语法: enum someEnumer { // 枚举的成员值 }   以下是方向的一个例子: enum direction...
  • hatsuna
  • hatsuna
  • 2015年07月27日 10:50
  • 302

通过Symantec PcAnywhere控制远程计算机-使用方法图解教程

 有时我们可能会碰到这样的情况:在公司临时需要家里电脑中的资料,但又不可能马上跑回家打开电脑拷贝吧。此时如果能在公司就能远程打开家中的电脑,并能进行远程访问控制,不就一切迎刃而解了吗!那么,又该如何实...
  • shh110
  • shh110
  • 2011年03月03日 15:43
  • 1505

iOS开发-正则表达式的使用方法

前言:在表单验证中,我们经常会使用到正则,因为我们需要用它来判断用户输入的字符是否为合法的,如果是不合法的,那么应该提示用户输入错误,并不让提交至服务器。我们也可以通过正则表达式,从用户输入的字符串中...

oc-字符串NSString,NSMutablesString基本使用方法

一.NSString字符串       》字符串是Foundation框架下的类,iOS2.0以后。      》 NSString是不可变的字符串,一旦被创建(即开辟了空间),只可读取,不能被修改(...

Cocos2d-x教程(27)-Cocos2d-x 2.2.x tolua++使用方法

Cocos2d-x 2.2.x版本使用tolua++工具绑定自定义C++方法到Lua

YII框架的依赖注入容器DI使用方法-实例说明

依赖注入(Dependency Injection,DI)容器就是一个对象,它知道怎样初始化并配置对象及其依赖的所有对象。 所谓的依赖就是,一个对象,要使用另外一个对象才能完成某些功能。那么这个对象...
  • xmlife
  • xmlife
  • 2016年08月02日 12:19
  • 782

bitmap造成OOM异常的解决方法-(重要文档)

转自:http://www.chengxuyuans.com/Android/67950.html Android 图片加载Bitmap OOM错误解决办法 Android加载资源图片时,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:sizeof使用方法--重要!!
举报原因:
原因补充:

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