sizeof总结并于strlen对比~

sizeof总结并于strlen对比

一、sizeof总结

在C/C++中,sizeof是一个判断数据类型或者表达式长度的运算符。其作用好像类似于strlen()函数,但是两者还是有所不同。

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.
————引自MSDN

sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数。其返回值类型为size_t,在头文件stddef.h中定义。这是一个依赖于编译系统的值,一般定义为

typedef unsigned int size_t;

sizeof参数可以是数组、指针、类型、对象、函数等。 具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:
数组——编译时分配的数组空间大小;
指针——存储该指针所用的空间大小;
类型——该类型所占的空间大小;
对象——对象的实际占用空间大小;
函数——函数的返回类型所占的空间大小(函数的返回类型不能是void)。
需要注意的是,基本数据类型的sizeof,这里的基本数据类型指short、int、long、float、double这样的简单内置数据类型,由于它们都是和系统相关的,所以在不同的系统下取值可能不同,这务必引起我们的注意,尽量不要在这方面给自己程序的移植造成麻烦。一般的,在32位编译环境中,sizeof(int)的取值为4。

总体而言,在语法上,sizeof可分为两种:

sizeof(type_name);//sizeof(类型);
sizeof object;//sizeof对象;

但是,sizeof计算对象的大小也是转换成对对象类型的计算,也就是说,同种类型的不同对象其sizeof值都是一致的。
而当sizeof对一个表达式求值,编译器根据表达式的最终结果类型来确定大小,一般不会对表达式进行计算。
sizeof也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会被调用。
sizeof的计算发生在编译时刻,所以它可以被当作常量表达式使用。
其实理解 sizeof 只需要抓住一个要点:栈
程序存储分布有三个区域:栈、静态和动态。能够从代码直接操作的对象,包括任何类型的变量、指针,都是在栈上的;动态和静态存储区是靠栈上的所有指针间接操作的。 sizeof 操作符,计算的是对象在栈上的投影体积;记住这个就很多东西都很清楚了。

 char const* str="Hello";
//sizeof(str)是sizeof一个指针,所以在32位系统下是4
char stack_str[]="Hello";
//sizeof(stack_str)是sizeof一个数组,所以是6*sizeof(char)
char* string=new_char[6];
strncpy(string, "Hello", 6);
//sizeof(string)是sizeof一个指针,所以还是4。

对于指针的sizeof操作,可以详见我之前的文章:指针解析
对于结构的sizeof操作,可以详见我之前的文章:简析结构体存储分配

二、strlen分析

strlen是C/C++中的函数,其用来获取字符串的长度。

strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符’\0’为止,然后返回计数器值(长度不包含’\0’)。
————百度百科

C++ Reference
从上面的图片我们不难看出strlen参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针了。strlen要在运行时才能计算。

三、sizeof 对比 strlen

1、原理
strlen(char*)函数求的是字符串的实际长度,直到遇到第一个’\0’,然后就返回计数值,且不包括’\0’。

char arr1[10];
cout<<strlen(arr1)<<endl; //结果是不定的,因为未初始化,'\0'在内存中的位置不确定

char arr2[10]={'\0'};
 cout<<strlen(arr2)<<endl; //结果为0

char arr3[10]="test"; 
cout<<strlen(arr3)<<endl; //结果为4

而sizeof()函数返回的是变量声明后所占的内存数,不是实际长度。

char arr1[10];
 cout<<sizeof(arr1)<<endl; //结果为10

int arr2[10];
 cout<<sizeof(arr2)<<endl; //结果为40

2、本质
sizeof是一个取字节运算符(操作符operator),而strlen是一个函数。

3、参数
sizeof参数比较广泛,可以用类型做参数,还可以用函数做参数。如:

int sum();
printf("%d\n",sizeof(sum()));//输出的结果是sizeof(int),即4。

strlen只能用char*做参数,且必须是以’’\0’'结尾的。

4、运行
大部分编译程序在编译的时候就把sizeof计算过了是类型或是变量的长度。这就是sizeof(x)可以用来定义数组维数的原因。
strlen的结果要在运行的时候才能计算出来,是用来计算字符串的长度,不是类型占内存的大小。

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

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

7、当数组做sizeof的参数不退化,而传递给strlen就退化为指针了。
这是因为数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址。在C++里参数传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值