sizeof,strlen总结比较

首先看一MSDN上如何对sizeof进行定义的:

sizeof   Operator

sizeof   expression

The   sizeof   keyword   gives   the   amount   of   storage,   in   bytes,   associated   with   a   variable   or   a   type   (including   aggregate   types).   This   keyword   returns   a   value   of   type   size_t.

The   expression   is   either   an   identifier   or   a   type-cast   expression   (a   type   specifier   enclosed   in   parentheses).

When   applied   to   a   structure   type   or   variable,   sizeof   returns   the   actual   size,   which   may   include   padding   bytes   inserted   for   alignment.   When   applied   to   a   statically   dimensioned   array,   sizeof   returns   the   size   of   the   entire   array.   The   sizeof   operator   cannot   return   the   size   of   dynamically   allocated   arrays   or   external   arrays.
--------------------------------------------------------------------------
然后再看一下对strlen是如何定义的:
strlen

Get   the   length   of   a   string.

Routine   Required   Header  
strlen   <string.h>  

size_t   strlen(   const   char   *string   );
Parameter
string  
Null-terminated   string  
Libraries
All   versions   of   the   C   run-time   libraries.

Return   Value
Each   of   these   functions   returns   the   number   of   characters   in   string,   excluding   the   terminal   NULL.   No   return   value   is   reserved   to   indicate   an   error.

Remarks
Each   of   these   functions   returns   the   number   of   characters   in   string,   not   including   the   terminating   null   character.   wcslen   is   a   wide-character   version   of   strlen;   the   argument   of   wcslen   is   a   wide-character   string.   wcslen   and   strlen   behave   identically   otherwise.
--------------------------------------------------------------------------

以下是我从CSDN上搜索sizeof关键字,进行的部分总结(不是很详细,欢迎补充,希望对大家有益)

首先看几个例子
第一个例子
char*   ss   =   "0123456789 ";
sizeof(ss)           结果   4         ===》ss是指向字符串常量的字符指针
sizeof(*ss)         结果   1         ===》*ss是第一个字符

char   ss[]   =   "0123456789 ";
sizeof(ss)           结果   11       ===》ss是数组,计算到/0位置,因此是10+1
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
strlen(ss)           错误             ===》strlen的参数只能是char*   且必须是以 '/0 '结尾的

char   q[]= "abc ";
char   p[]= "a/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(指针大小)


--------------------------------------------------------------------------

总结如下:
1.sizeof的结果   
sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned 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++在处理数据时经常把结构变量中的成员的大小按照4或8的倍数计算,这就叫数据对齐(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 *malloc(size_t size),   
  size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)。
2.用它可以看看一类型的对象在内存中所占的单元字节。
      void * memset(void * s,int c,sizeof(s))
3.在动态分配一对象时,可以让系统知道要分配多少内存。
4.便于一些类型的扩充,在windows中就有很多结构内型就有一个专用的字段是用来放该类型的字节大小。
5.由于操作数的字节数在实现时可能出现变化,建议在涉及到操作数字节大小时用ziseof来代替常量计算。
6.如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。

 

 

 

 

 

 

 

其实理解   sizeof   只需要抓住一个要点:栈
程序存储分布有三个区域:栈、静态和动态。所有能够从代码直接操作的对象,包括任何类型的变量、指针,都是在栈上的;动态和静态存储区是靠栈上的指针间接操作的。   sizeof   操作符,计算的是对象在栈上的投影体积;记住这个就很多东西都很清楚了。

char   const   *   static_string   =   "Hello ";
sizeof(static_string)   是   sizeof   一个指针,所以在   32bit   system   是   4
char   stack_string[]   =   "Hello ";
sizeof(stack_string)   是   sizeof   一个数组,所以是   6   *   sizeof(char)
char   *   string   =   new   char[6];
strncpy(string,   "Hello ",   6 ");
sizeof(string)   是   sizeof   一个指针,所以还是   4。和第一个不同的是,这个指针指向了动态存储区而不是静态存储区。
不管指针指向的内容在什么地方,sizeof   得到的都是指针的栈大小

C++   中对引用的处理比较特殊;sizeof   一个引用得到的结果是   sizeof   一个被引用的对象的大小;所以
struct   O
{
    int   a,   b,   c,   d,   e,   f,   g,   h;
};
 
int   main()
{
    O   &   r   =   *new   O;
    cout   < <   sizeof(O)   < <   endl;   //   32
    cout   < <   sizeof   r   < <   endl;     //   也是   32
    system( "PAUSE ");
}  

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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值