本文主要记录了 sizeof 操作符 和 strlen() 函数的区别,以及各自的用途。(在下才疏学浅,发现错误,还请留言指正)


sizeof 和 strlen 的区别

示例代码如下:

#include<stdio.h>
int main()
{
char str[]="";
printf("strlen(str)==%d\n",strlen(str));//计算字符串的长度(不包括0x00),结果:10
printf("sizeof(str)==%d\n",sizeof(str));//大小不退化,结果:20 char* ss = "";
printf("strlen(ss)==%d\n",strlen(ss));//结果:10
printf("sizeof(ss)==%d\n",sizeof(ss));//计算ss指针占用内存空间的大小,结果:4
return ;
}
  1. 从代码着色我们就可以看出来,sizeof是操作符,strlen是函数。
  2. sizeof操作符的结果类型是size_t,它的头文件在typedef为unsigned int类型,无符号,可以存储最大对象字节的大小。
  3. sizeof可以用数据类型做参数,strlen只能使用char*做参数,且必须是以'\0'结尾的。
  4. 数组做sizeof不退化,但是,传递给strlen就退化为指针了。
  5. 大部分编译器在编译的时候sizeof就计算好了,这就是sizeof(x)可以用来定义数组维数的原因。strlen的结果要在运行的时候才能计算出来,他用来计算字符串的长度,不是类型占内存的大小。
  6. sizeof如果是类型的话,必须加括号,但是如果是变量名的话,可以不加括号,因为sizeof是个操作符,而不是函数。

sizeof有哪些作用?

  1. 与存储分配和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. 由于操作符的字节数在实现时可能出现变化,建议在涉及操作数字节大小时用sizeof来代替常量计算。
  6. 如果,操作数是函数中的数值形参或函数类型的参数,则sizeof给出其指针的大小。

试着用sizeof 替换 strlen计算字符串的长度

像这种替换是很少用到的,之所以这样写,仅仅方便知识点的掌握。

//题意:计算字符串的长度,并转化大写。
#include <iostream>
#include<string>
using namespace std;
void upperCase(char str[])
{
int test = sizeof(str);//strlen(str)
int test2 =sizeof(str[]);
for(size_t i=;i<test/test2;++i)//i<test
{
if( 'a' <= str[i] && str[i] <= 'z' )
str[i] -= ('a' - 'A');
}
}
int main()
{
char str[] = "aBcDe";
//从上面我们知道sizeof(数组),是不退化的,返回的结果是整个数组的大小,而不是里面元素的个数。
//如果数组的初始化为 char str[9] = "aBcDe",那么结果就不正确了。
cout<<"The length of str is:"<<sizeof(str)/sizeof(str[])<<endl;//strlen(str)
upperCase(str);
cout << str << endl;
return ;
}

sizeof计算 union联合体的大小

示例代码1:

#include <iostream>
using namespace std;
union u
{
double a;
int b;
};
union u2
{
char a[];
int b;
};
union u3
{
char a[];
char b;
};
int main()
{
cout<<"sizeof(u) == "<<sizeof(u)<<endl;//结果:8
cout<<"sizeof(u2) == "<<sizeof(u2)<<endl;//结果:16(使用了字节对齐)
cout<<"sizeof(u3) == "<<sizeof(u3)<<endl;//结果:13(使用了字节对齐)
return ;
}

union的大小取决于成员中占用空间最大的那个成员(考虑字节的对齐),同时,考虑字节对齐的符合数据类型有:union,class,struct

CPU对齐的问题,编译器会尽量把数据放在它的对齐上以提高CPU的命中率。可以使用#pragma pack(x)来修改编译器的对齐方式。

C++固有类型的对齐取编译器对齐方式与自身大小中较小的一个。例如:编译器以2对齐,int类型大小是4,则int的对齐是2和4中最小的2.因为默认的对齐是8(long double),所以固有类型的对齐方式就是自身。如果是符合类型,则都小于8的话,取成员类型最大的对齐。


示例代码2:

#include <iostream>
using namespace std;
#pragma pack(2)//手动将对齐方式修改为2,所以int的对齐也为2了。所以结果10,如果去掉这一句,则为12
union u
{
char buf[];
int a;
};
int main()
{
cout<<"sizeof(u) == "<<sizeof(u)<<endl;
return ;
}

sizeof && strlen 的区别的更多相关文章

  1. sizeof和strlen的区别

    一.sizeof    sizeof(...)是运算符,而不是一个函数.    sizeof操作符的结果类型是size_t,在头文件中typedef为unsigned int,其值在编译时即计算好了, ...

  2. Sizeof与Strlen的区别与联系

    转自:http://www.cnblogs.com/carekee/articles/1630789.html 一.sizeof    sizeof(...)是运算符,在头文件中typedef为uns ...

  3. Sizeof与Strlen的区别与联系(转)

    Sizeof与Strlen的区别与联系 一.sizeof     sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型 ...

  4. C++-sizeof和strlen的区别

    一.sizeof    sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型.对象.函数等.    它的功能是:获得保 ...

  5. sizeof和strlen的区别和联系总结

    link:http://blog.csdn.net/ghevinn/article/details/9974967    strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头 ...

  6. 【转】Sizeof与Strlen的区别与联系

    原文地址:http://www.cnblogs.com/carekee/articles/1630789.html 1.sizeof  sizeof(...)是运算符,在头文件中typedef为uns ...

  7. C++Sizeof与Strlen的区别与联系

    一.sizeof    sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型.对象.函数等.    它的功能是:获得保 ...

  8. Sizeof与Strlen的区别【转】

    本文转载自:http://www.cnblogs.com/carekee/articles/1630789.html Sizeof与Strlen的区别与联系 一.sizeof    sizeof(.. ...

  9. sizeof, strlen区别

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

随机推荐

  1. 关于“float”的一次探索--遇到了一个span元素可以设置宽高引发的思考

    起初,这个问题和float还有设置宽高之间是没有任何关联的,一开始这是一个关于height和line-height的问题,目的是为了探究一下这两者之间的关系,但是在学习的过程中,我翻之前写的代码,发现 ...

  2. 解决jquery1.9不支持browser对象的问题||TypeError: $.browser is undefined

    在插件的源代码里插入如下代码: (function(jQuery){ if(jQuery.browser) return; jQuery.browser = {}; jQuery.browser.mo ...

  3. 虚拟机上安装Linux操作系统

    很久之前就知道虚拟机这个东西,也都在虚拟机上安装过Windows的操作系统和Linux的操作系统,但是一直都没有去做笔记. 最近还是比较有时间,就移除了前两天刚刚安装的Linux系统,重新安装一次,做 ...

  4. Python项目:扇贝网小组查卡助手

    扇贝网是一个非常棒的英语学习网站,大家还可以加入一些小组,一起交流学习.共同进步.但是,小组管理起来非常辛苦,尤其是在0点前踢出不打卡的成员,因此考虑利用程序来实现小组查卡自动化. 登录 操作 扇贝网 ...

  5. 使用JSON Schema来验证接口数据

    最近在做一些关于JSON Schema的基建,JSON Schema可以描述一个JSON结构,那么反过来他也可以来验证一个JSON是否符合期望的格式. 如果之前看我写的<使用joi来验证数据模型 ...

  6. WPF控件经验小结:(1) ToolBar去掉右边箭头(扩展图标)

    今天开发时,同事问我一个问题.怎么去除ToolBar右边扩展图标.我想了一下,说改Style.同事说太麻烦了.可不可以快速修正.我说应该动态去读取Template模板中的Style,然后隐藏.怎么实现 ...

  7. [原] XAF 添加日期筛选下拉选择

    1.ListView 添加日期筛选下拉选择,选择指定,可指定日期范围 2.Code using DevExpress.Data.Filtering; using DevExpress.ExpressA ...

  8. [原] XAF How to bind a stored procedure to a ListView in XAF

    First, I suggest that you review the following topic to learn how to show a custom set of objects in ...

  9. 萝卜白菜,给有所爱——C#和JAVA都会终将被时代淘汰

    看到园子里又有一波试图掀起C#和JAVA的谁更好的争论,对于这些一直不断的争论,我觉得实在没有必要,黑格尔的存在即合理,中国的老古语说的萝卜白菜各有所爱,大家争论的再多其实卵用也没用,还不如趁着闲暇时 ...

  10. vs2010中的MSBuild输出warning MSB8012问题

    vs2010中,MSBuild与C++编译器无缝整合.无论使用vs2010生成的代码,还是转换vs2008或者是更低版本vs编译的C++代码.都会在工程编译后,都会提示一条错误: C:\Program ...