strlen函数、sizeof运算符、size_t类型 的介绍与对比

   此文章为网上相关内容的小总结

size_t

   在C Primer Plus 书中解释,为了提供可移植性,在stddef.h头文件中(程序包含stdio.h时已经包含它),size_t定义成系统使用sizeof返回的类型,这也被称为底层类型,其次在printf()可使用z修饰符表示打印相应类型。
   size_t在32位架构中被普遍定义为:typedef unsigned int size_t;
   size_t在64位架构中被定义为:typedef unsigned long size_t;
   size_t一般用来表示一种计数,比如有多少东西被拷贝等。例如:sizeof操作符的结果类型是size_t,该类型保证能容纳实现所建立的最大对象的字节大小。 它的意义大致是“适于计量内存中可容纳的数据项目个数的无符号整数类型”。所以,它在数组下标和内存管理函数之类的地方广泛使用。
   size_t在32位架构上是4字节,在64位架构上是8字节,在不同架构上进行编译时需要注意这个问题。而int在不同架构下都是4字节,与size_t不同;且int为带符号数,size_t为无符号数。

sizeof

   sizeof为C语言40多个运算符之一,sizeof以字节为单位返回运算对象的大小。包括结束字符(即 null 字符)

char A[] = "itistest";
/*用sizeof求长度*/
printf("A的长度=%d\n", sizeof(A));

   这里的示例代码运行结果为 9(因为它包括结束字符 null)。同时,对 sizeof 而言,因为缓冲区已经用已知字符串进行了初始化,其长度是固定的,所以 sizeof 在编译时计算缓冲区的长度。也正是由于在编译时计算,因此 sizeof 不能用来返回动态分配的内存空间的大小。

strlen

   strlen为一个函数,只能用作给出字符串长度,但不包括结束字符(即 null 字符)以下为函数原型
size_t strlen(char const* str);

char A[] = "itistest";
/*用strlen()求长度*/
printf("A的长度=%d\n", strlen(A));

   很显然,上面示例代码的运行结果为 8(因为不包括结束字符 null)。这里需要特别注意的是,函数 strlen 返回的是一个类型为 size_t 的值。

   在用作计算数组内的字符串长度时,两者区别明显

char A[20] = "itistest";
int a = strlen(A); /*a = 8*/
int b = sizeof(A);/*b = 20*/

   其中 a变量数值为8 ,b变量数值为20
   这是因为strlen计算的是字符串的实际长度,以第一个’\0’为结束符;而sizeof计算的是分配的数组所占的空间大小,不受里面存储内容的影响。

strlen、sizeof、size_t三者总结对比

   size_t类型(即无符号整型)其值绝不可能是负的,永远为正
   strlen为求取一个字符串的长度函数不包括null字符)
   也就是白话说,其返回值就是我们眼睛能看到的字符串的个数
   sizeof运算符,可以返回对象的大小(类型不限)
   在字符串的求取问题上,需要包括null字符 长度+1
   在数组内的字符串长度求取问题上,其返回值为数组的容量大小

   sizeof是编译期就计算完成的,strlen是运行期计算的。因为缓冲区已经用已知字符串进行了初始化,其长度是固定的,所以 sizeof 在编译时计算缓冲区的长度。也正是由于在编译时计算,因此 sizeof 不能用来返回动态分配的内存空间的大小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值