sizeof和strlen

来源:互联网 发布:dota2国服四君子 知乎 编辑:程序博客网 时间:2024/04/27 15:33

sizeof(double)?

一个整型表达式
  • sizeof主一个操作符,不是函数调用,它将返回一个无符号的整形数据。因此可以将其看成一个无符号整形的表达式。


1、例程分析1

char a[10]="abcd"; sizeof(a)为10为什么?字符不是才一个字节吗?不是应该为5吗?


strlen 是返回字符串的长度。而sizeof,却是用来取得变量或类型所占用的内存大小的。这个a数组的字符串长度为4(末尾的\0是不计入字符串长度的),但a是10个单位的char型,它占用的内存空间是10*sizeof(char),为10. sizeof 返回的数量的单位是Byte.

2、例程分析2

已知 char *str1="absde";
char str2[]="absde";
char str3[8]={'a',};
char ss[] = "0123456789";

为什莫 sizeof(str1)=4
sizeof(str2)=6;
sizeof(str3)=8;
sizeof(ss)=11

32位机器上, 任何指针变量都只占4个字节。 64位机器则是8个字节。


首先说明一点,char类型占一个字节,所以sizeof(char)是1,这点要理解str1是一个指针,只是指向了字符串"absde"而已。所以sizeof(str1)不是字符串占的空间也不是字符数组占的空间,而是一个字符型指针占的空间。所以sizeof(str1)=sizeof(char*)=4,在C/C++中一个指针占4个字节str2是一个字符型数组。C/C++规定,对于一个数组,返回这个数组占的总空间,所以sizeof(str2)取得的是字符串"absde"占的总空间。"absde"中,共有a b s d e \0六个字符,所以str2数组的长度是6,所以sizeof(str2)=6*sizeof(char)=6str3已经定义成了长度是8的数组,所以sizeof(str3)为8str4和str2类似,'0' '1' ... '9'加上'\0'共11个字符,所以ss占的空间是11总之,对于指针,sizeof操作符返回这个指针占的空间,一般是4个字节;而对于一个数组,sizeof返回这个数组所有元素占的总空间。char*与char[]容易混淆,一定要分清,而且char*="aaa"的写法现在不被提倡,应予以避免而strlen不区分是数组还是指针,就读到\0为止返回长度。而且strlen是不把\0计入字符串的长度的。


3、例程分析3

charc1[]={'a','b','\0','d','e'};strlen(c1)的值是多少?

Strlen是计算字符串长度,遇到’\0’结束。c1的\0前面有两个字符,所以strlen(c1)的值为2.

4、C++对空类或者空结构体,对其sizeof操作时候,默认都是1个字节


5、例程分析4(类的大小)


  • 类B虚拟继承类A。
    A中的内存方式是:4(int)+4(char对齐)+4(A中的虚指针)=12
    B中的方式是:4(A::int)+4(A::char对齐)+4(B中的虚指针)=12
    其中A的虚指针和B的虚指针不一样,并且各种的虚函数表也不一样。

    如果将class B:public A 改成 class B:virtual public A
    则B中会多一个指向虚继承的指针:12+4(Ptr_B->A)=16。

    如果再 class B中,多定义一个A中没有的虚函数,则又多4字节。不清楚具体是什么内容,猜测是B中又多了一个虚函数表。 

6、例程5


  • 含有虚函数的类都会建立一张虚函数表,表中存放的是虚函数的函数指针,这个表的地址存放在类中,所以不管有几个虚函数,sizeof(P)的大小都是4+4=8

7、实例6


结果是8 4 4 10 2 1


  • 数组名不等价于指针,只有数组名作为函数参数时,才退化为指针
  • 数组名不等价于指针,只有数组名作为函数参数时,才退化为指针



char str[]=”xunlei”;char* p=str;
sizeof(*p)=1.

*p是char 类型的,指针p指向第一个元素,故sizeof(*p)应该返回相应值的字节数,



0 0
原创粉丝点击