本文主要记录了 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. vs快捷键visual studio

    网上抄的.记录下来.没全试过!强大的VS,真的喜欢! Shift+Alt+Enter: 切换全屏编辑 Ctrl+B,T / Ctrl+K,K: 切换书签开关Ctrl+B,N / Ctrl+K,N: 移 ...

  2. android 常见面试题以及答案

    http://blog.csdn.net/bobo1808/article/details/6783344 1.    请描述下Activity的生命周期.2.    如果后台的Activity由于某 ...

  3. D3(Data-Driven-Document)中的一些细节

    不定期更新,给自己看,如果能帮到别人,我也很开心. 1)好像 function中默认的两个参数d,和i,如果只有i,则i实际上是d 的内容. lineG.selectAll("line&qu ...

  4. 【分块打表】bzoj3798 特殊的质数

    块大小为10^5. #include<cstdio> using namespace std; const int table[] = {0, 4784, 8978, 12981, 169 ...

  5. 关于display: box 和 box-flex

    这两天做手机项目,使用到这个css3新属性.现在还不为所有浏览器支持,所以使用的时候要加上前缀.使用方法见下面: html代码: <div class="s-indLine" ...

  6. 【转】Linux中xargs的用法

    xargs大 多数 Linux 命令都会产生输出:文件列表.字符串列表等.但如果要使用其他某个命令并将前一个命令的输出作为参数该怎么办?例如,file 命令显示文件类型(可执行文件.ascii 文本等 ...

  7. Xcode调用旧版本库出现Undefined symbols for architecture x86_64: ld: symbol(s) not found for architecture x86_64

    问题:Undefined symbols for architecture x86_64:   ld: symbol(s) not found for architecture x86_64 问题原因 ...

  8. Restore Oracle database to another server

    1. Copy or remotely mount the backupset folder from the source server to the target server 2. On the ...

  9. mysql5.7 密码策略

    查看现有的密码策略 mysql> SHOW VARIABLES LIKE 'validate_password%';+-------------------------------------- ...

  10. NSDate

    NSDate : NSDate *date = [NSDate date];获取当前日期 NSDate 可以进行比较,通过earlierDate:方法获取二个日期中最早的. NSDate 通过late ...