strlen与sizeof的区别

2 篇文章 0 订阅
2 篇文章 0 订阅

①Sizeof是运算符而strlen是函数

②Sizeof可以用类型做参数,strlen只能用char*做参数

③数组做sizeof参数不退化,而传递给strlen则退化成指针

④strlen结果是运行时候才能计算出来,而且计算出来的是字符串的长度不是内村的大小

⑤当使用的是结构体或者变量时,sizeof返回的是实际的大小,静态空间数组则返回数组的尺寸

⑥sizeof不能返回动态分配的数组或者外部数组的尺寸

题:注:strlen获取的是不带\0结束符的大小,即是字符串本身的大小,sizeof测得大小是内存的大小。

①int a[o10],则sizeof(a)的值为32

因为o10代表是八进制 ,结果就是a【8】;所以是32

③ char str【】 = “hello\n\0\n”,则strlen(str)值是6. 因为strlen遇见\0结束符则结束所以值是6, sizeof(str) 值是9;

④ char* str= “hello\n\0\n” ,则strlen(str)值是6 sizeof(str) 值是4

⑤char str1[] = “Hello” ;

char str2[5] = {‘H’,‘e’,‘l’,‘l’,‘o’};

char str3[6] = {‘H’,‘e’,‘l’,‘l’,‘o’,‘/0’};

char *p1 = “Hello”;

char *p2[]={“hello”,“world”};

int n = 10;

int *q = &n;

sizeof (str1 ) = 6 (自动加了’/0’)

strlen (str1 ) = 5 (字符串的长度)

sizeof (str2 ) = 5 (字符数组的大小)

strlen (str2) = 未知 (该字符串缺少结束符’/0’)

sizeof (str3) = 6 (字符数组的大小)

strlen (str3) = 5 (该字符串的长度为5)

sizeof ( p1 ) = 4 (p1是一个指针,大小为4)

sizeof ( p2 ) = 8 (p2是长度为2的字符串数组)

sizeof ( n ) = 4 (整型大小为4)

sizeof ( q ) = 4 (q是一个指针,大小为4)

⑥动态分配内存

int *p = (int *)malloc( 100 );

sizeof ( p ) = 4 (p是一个指针,大小为4)

⑦函数参数

void Function1( char p[],int num ){

sizeof ( p ) = 4 (数组在做为函数参数时均化为指针)

}

void Function2( int p[],int num ){

sizeof ( p ) = 4 (数组在做为函数参数时均化为指针)

}

⑧多重继承

class A{};

class B{};

class C:public A,public B{};

class D:virtual public A{};

class E:virtual public A,virtual public B{};

sizeof ( A ) = 1 (空类大小为1,编译器安插一个char给空类,用来标记它的每一个对象)

sizeof ( B ) = 1 (空类大小为1,编译器安插一个char给空类,用来标记它的每一个对象)

sizeof ( C ) = 1 (继承或多重继承后空类大小还是1)

sizeof ( D ) = 4 (虚继承时编译器为该类安插一个指向父类的指针,指针大小为4)

sizeof ( E ) = 8 (指向父类A的指针与父类B的指针,加起来大小为8)

⑨函数与虚函数

编译器为每个有虚函数的类都建立一个虚函数表(其大小不计算在类中),并为这个类安插一个指向虚函数表的指针,即每个有虚函数的类其大小至少为一个指针的大小4

class A{

public:

int a;

void Function();

};

class B{

public:

int a;

virtual void Function();

};

class C:public B{

public:

char b;

};

class D:public B{

public:

virtual void Function2();

};

class E{

public:

static void Function();

};

sizeof (A) = 4 (内含一个int,普通函数不占大小)

sizeof (B) = 8 (一个int ,一个虚函数表指针)

sizeof © =12 (一个int ,一个虚函数表指针,一个char ,再加上数据对齐)

sizeof (D) = 8 (一个int ,一个虚函数表指针,多个虚函数是放在一个表里的,所以虚函数表指针只要一个就行了)

sizeof (E) = 1 (static 函数不占大小,空类大小为1)

⑩父类的私有数据

虽然在子类中不可用,但是是可见的,因此私有的数据还是要占子类的大小

class A{

private:

int a;

};

class B:public A{};

sizof(B) = 4; (内含一个不可用的父类的int)

class static_D

{

int static intVar;

static void fun(){}

};

sizeof(static_D) ==1 //静态数据成员不计入类内

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Serendipity_ry

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值