此文章为网上相关内容的小总结
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 不能用来返回动态分配的内存空间的大小。